Oracle的学习心得和知识总结(八)|Oracle数据库PL/SQL语言GOTO语句技术详解

news2024/11/30 4:55:13

注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下:

1、参考书籍:《Oracle Database SQL Language Reference》
2、参考书籍:《PostgreSQL中文手册》
3、EDB Postgres Advanced Server User Guides,点击前往
4、PostgreSQL数据库仓库链接,点击前往
5、PostgreSQL中文社区,点击前往
6、Oracle数据库 GOTO Statement 官方文档说明,点击前往
7、EDB数据库 GOTO statement v14官方文档说明,点击前往


1、本文内容全部来源于开源社区 GitHub和以上博主的贡献,本文也免费开源(可能会存在问题,评论区等待大佬们的指正)
2、本文目的:开源共享 抛砖引玉 一起学习
3、本文不提供任何资源 不存在任何交易 与任何组织和机构无关
4、大家可以根据需要自行 复制粘贴以及作为其他个人用途,但是不允许转载 不允许商用 (写作不易,还请见谅 💖)
5、本文仅适于从事于PostgreSQL数据库内核开发者和数据库爱好者,对普通读者而言难度较大 但对于希望从事于数据库内核开发的初学者来说,是一次机会十分难得的学习案例 💪
6、本文内容基于PostgreSQL15.0源码开发而成


Oracle数据库PL/SQL语言GOTO语句技术详解

  • 本人博客严正声明
  • 文章快速说明索引
  • GOTO语句的说明



本人博客严正声明

是这样的,熟悉在下的小伙伴们都知道 我写博客主要目的就是分享和学习总结。至于CSDN的排名 排名什么的,我并不是很在意!

  • 一来 很不喜欢标题党
  • 二来 更反感灌些水文
  • 三来 痛恨无下限抄袭

本人博客都是认认真真写的,结果在CSDN并没有什么的太大的名气 关注度什么的也不高!前些天 一位好心的粉丝私聊了在下,反而一名某平台的哥们儿 快把我的《PostgreSQL的学习心得和知识总结》都给照搬过去了,甚至一个字都不改(连同在下 都是只字不提 好歹稍微提一下呀)!!!

实在是太过分,后来经过(友好)协商,现已经全部删除了!

本人是做PostgreSQL内核开发的,深感当下学风不正 大家都很浮躁,一向踏踏实实深耕的并不是很多!因为写代码这件事情上,欺骗不了任何人!本本分分老老实实地写好代码做好学问十分不易,容不得掺沙子和造假!这里把我喜欢的一句话送给各位以共勉:

非淡泊无以明志,
非宁静无以致远!


文章快速说明索引

学习目标:

目的:接下来这段时间我想做一些兼容Oracle数据库PL/SQL语言上的一些功能开发,本专栏这里主要是学习以及介绍Oracle数据库功能的使用场景、原理说明和注意事项等,基于PostgreSQL数据库的功能开发等之后 由新博客进行介绍和分享!今天我们主要看一下 PL/SQL语言GOTO语句 的相关内容!


学习内容:(详见目录)

1、Oracle数据库PL/SQL语言GOTO语句


学习时间:

2022-11-29 10:25:10


学习产出:

1、Oracle数据库PL/SQL语言GOTO语句
2、CSDN 技术博客 1篇


注:下面我们所有的学习环境是Centos7+PostgreSQL15.0+Oracle12c+MySQL5.7

postgres=# select version();
                                   version                                   
-----------------------------------------------------------------------------
 PostgreSQL 15.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.1.0, 64-bit
(1 row)

postgres=#

#-----------------------------------------------------------------------------#

SQL> select * from v$version;          

BANNER										     CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production		  0
PL/SQL Release 12.2.0.1.0 - Production							  0
CORE	12.2.0.1.0	Production								  0
TNS for Linux: Version 12.2.0.1.0 - Production						  0
NLSRTL Version 12.2.0.1.0 - Production							  0

SQL>

#-----------------------------------------------------------------------------#

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.19    |
+-----------+
1 row in set (0.06 sec)

mysql>

GOTO语句的说明

GOTO 语句将控制转移到带标签的块或语句,即:该语句使执行点跳转到具有指定标签的语句。


GOTO 语句的限制如下:

如果 GOTO 语句过早地退出游标 FOR LOOP 语句,游标将关闭。

  • GOTO 语句不能将控制转移到 IF 语句、CASE 语句、LOOP 语句或子块中
  • GOTO 语句不能将控制从一个 IF 语句子句转移到另一个,或从一个 CASE 语句 WHEN 子句转移到另一个
  • GOTO 语句不能将控制转移出子程序
  • GOTO 语句无法将控制转移到异常处理程序中
  • GOTO 语句无法将控制从异常处理程序转移回当前块(但它可以将控制从异常处理程序转移到封闭块 即:父块)
  • GOTO 语句不能将控制转移到条件块或子块中,但可以从条件块或子块中转移控制

  • GOTO 语句不能跳转到声明(declaration)
  • GOTO 语句不能将控制转移到另一个函数或过程中
  • 标签(label)不应放在块、函数或过程的末尾

其语法格式如下:

在这里插入图片描述

GOTO <label>

标签:标识语句label 是分配给可执行语句或块的名称。在函数、过程或块的范围内必须是唯一的。要标记语句,请使用以下语法:

<<label>> <statement>

-- 其中 statement 是程序跳转到的执行点

如果 label 不在当前块中,则 GOTO 语句将控制转移到 label 出现的第一个封闭块。你可以标记(label)赋值语句、任何 SQL 语句和选定的过程语言语句。可以标记的过程语言语句有:

-- EDB (V14)

IF
EXIT
RETURN
RAISE
EXECUTE
PERFORM
GET DIAGNOSTICS
OPEN
FETCH
MOVE
CLOSE
NULL
COMMIT
ROLLBACK
GOTO
CASE
LOOP
WHILE
FOR

exit 被视为关键字,不能用作标签的名称。对应成语法如下:

statement ::= <Assign_Statement>
 | <If_Statement>
 | <Loop_Statement>
 | <While_Statement>
 | <For_Statement>
 | <Goto_Statement> // 这就是我们这次要开发的
 | <Case_Statement>
 | <Exit_Statement>
 | <Return_Statement>
 | <Raise_Statement>
 | <Perform_Statement>
 | <Execute_Statement>
 | <Commit_Statement>
 | <RollBack_Statement>
 | <Close_Statement>
 | <Open_Statement>
 | <Fetch_Statement>
 | <Sql_Statement>
 | <Null_Statement> 
 | <Get_Diagnostics_Statement>

-- 注:在PostgreSQL15中只会更多,详细请见:
-- src/pl/plpgsql/src/pl_gram.y 的 proc_stmt

其使用案例如下:

示例一:标签可以出现在语句之前:

-- 判断一个数是否为素数

SQL> set serveroutput on; 
SQL> DECLARE
  p  VARCHAR2(30);
  n  PLS_INTEGER := 37;
BEGIN
  FOR j in 2..ROUND(SQRT(n)) LOOP
    IF n MOD j = 0 THEN
      p := ' is not a prime number';
      GOTO print_now;
    END IF;
  END LOOP;

  p := ' is a prime number';
 
  <<print_now>> --here
  DBMS_OUTPUT.PUT_LINE(TO_CHAR(n) || p);
END;
/
  2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17  37 is a prime number

PL/SQL procedure successfully completed.

SQL>
SQL> DECLARE
  p  VARCHAR2(30);
  n  PLS_INTEGER := 64;
BEGIN
  FOR j in 2..ROUND(SQRT(n)) LOOP
    IF n MOD j = 0 THEN
      p := ' is not a prime number';
      GOTO print_now;
    END IF;
  END LOOP;

  p := ' is a prime number';
 
  <<print_now>> --here
  DBMS_OUTPUT.PUT_LINE(TO_CHAR(n) || p);
END;
/
 
  2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17  64 is not a prime number

PL/SQL procedure successfully completed.

SQL>

示例二:标签只能出现在块之前或语句之前:

SQL> DECLARE
  done  BOOLEAN;
BEGIN
  FOR i IN 1..50 LOOP
    IF done THEN
       GOTO end_loop;
    END IF;
    <<end_loop>> --here
  END LOOP;
END;
/
 
  2    3    4    5    6    7    8    9   10   11    END LOOP;
  *
ERROR at line 9:
ORA-06550: line 9, column 3:
PLS-00103: Encountered the symbol "END" when expecting one of the following:
( begin case declare exit for goto if loop mod null raise
return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge
json_exists json_value json_query json_object json_array


SQL>

示例三:标签可以出现在 NULL 语句之前:

SQL> DECLARE
  done  BOOLEAN;
BEGIN
  FOR i IN 1..50 LOOP
    IF done THEN
      GOTO end_loop;
    END IF;
    <<end_loop>> --here
    NULL;
  END LOOP;
END;
/
  2    3    4    5    6    7    8    9   10   11   12  
PL/SQL procedure successfully completed.

SQL>
SQL> BEGIN
	FOR i IN 1..50 LOOP
		IF i = 30 THEN
			GOTO end_loop;
		END IF;
	END LOOP;
	<<end_loop>>
	NULL;
END;
/
  2    3    4    5    6    7    8    9   10  
PL/SQL procedure successfully completed.

SQL>

示例四:GOTO 语句可以将控制权从当前块转移到封闭块。如下使用GOTO将分出一个环绕块:

create table employees (employee_id number(6), last_name VARCHAR2(25));

insert into employees values (120, 'Weiss');
insert into employees values (121, 'Weiss1');
insert into employees values (122, 'Weiss2');
insert into employees values (123, 'Weiss3');
insert into employees values (124, 'Weiss4');

SQL> select * from employees;

EMPLOYEE_ID LAST_NAME
----------- -------------------------
	120 Weiss
	121 Weiss1
	122 Weiss2
	123 Weiss3
	124 Weiss4

SQL>
SQL> DECLARE
  v_last_name  VARCHAR2(25);
  v_emp_id     NUMBER(6) := 120;
BEGIN
  <<get_name>>
  SELECT last_name INTO v_last_name
  FROM employees
  WHERE employee_id = v_emp_id;
  
  BEGIN
    DBMS_OUTPUT.PUT_LINE (v_last_name);
    v_emp_id := v_emp_id + 2;
 
    IF v_emp_id < 125 THEN
      GOTO get_name;
    END IF;
  END;
END;
/
  2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19  Weiss
Weiss2
Weiss4

PL/SQL procedure successfully completed.

SQL>

示例五:GOTO 语句将控制转移到 IF 语句,导致错误:

SQL> DECLARE
  valid BOOLEAN := TRUE;
BEGIN
  GOTO update_row;
  
  IF valid THEN
  <<update_row>>
    NULL;
  END IF;
END;
/
  2    3    4    5    6    7    8    9   10   11    GOTO update_row;
  *
ERROR at line 4:
ORA-06550: line 4, column 3:
PLS-00375: illegal GOTO statement; this GOTO cannot branch to label 'UPDATE_ROW'
ORA-06550: line 6, column 12:
PL/SQL: Statement ignored


SQL>

示例六:GOTO用在循环当中。作用类似于continue:

SQL> create or replace procedure test111 is
  i integer;
begin
  i := 2;
  loop
    <<next_step>>
    i := i * 2;
    if i > 100 then
      exit;
    end if; 
    if i > 50 then
      goto next_step;
    end if;
    dbms_output.put_line(i);
  end loop;
end; 
/
  2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17  
Procedure created.

SQL>
SQL> call test111();
4
8
16
32

Call completed.

SQL>

如上:

  1. <<next_step>>:这是循环标签,next_step是名字,可以自己定义
  2. goto next_step:表示i > 50后继续走到标签所在的位置执行代码
  3. 特别注意:<<next_step>> 后面不能直接跟EXCEPTION、END LOOP这种关键字类的语句,可以用NULL把标签跟关键字隔开

示例七:下面这个示例验证员工记录是否包含姓名、职位描述和员工雇用日期;如果缺少任何信息,则语句将执行点转移到打印一条消息的语句,该消息表明该员工无效:

-- EDB数据库提供

CREATE OR REPLACE PROCEDURE verify_emp (
    p_empno         NUMBER
)
IS
    v_ename         emp.ename%TYPE;
    v_job           emp.job%TYPE;
    v_hiredate      emp.hiredate%TYPE;
BEGIN
    SELECT ename, job, hiredate
        INTO v_ename, v_job, v_hiredate FROM emp
        WHERE empno = p_empno;
    IF v_ename IS NULL THEN
        GOTO invalid_emp;
    END IF;
    IF v_job IS NULL THEN
        GOTO invalid_emp;
    END IF;
    IF v_hiredate IS NULL THEN
        GOTO invalid_emp;
    END IF;
    DBMS_OUTPUT.PUT_LINE('Employee ' || p_empno ||
        ' validated without errors.');
    RETURN;
    <<invalid_emp>> DBMS_OUTPUT.PUT_LINE('Employee ' || p_empno ||
        ' is not a valid employee.');
END;

示例八:GOTO不能跳转到 exception 中:

SQL> BEGIN
	GOTO LB3; --expected error
	EXCEPTION
	WHEN OTHERS THEN
	<<LB3>>
	NULL;
END;
/
  2    3    4    5    6    7    8  	GOTO LB3; --expected error
	*
ERROR at line 2:
ORA-06550: line 2, column 2:
PLS-00375: illegal GOTO statement; this GOTO cannot branch to label 'LB3'
ORA-06550: line 4, column 14:
PL/SQL: Statement ignored


SQL>

示例九:

SQL> DECLARE
	I INT := 0;
BEGIN
	<<LB1>>
	I := I + 1;
	dbms_output.put_line(I);
	BEGIN
		<<LB2>>
		iF I = 1 THEN
			RAISE INVALID_NUMBER;
		ELSE
			RAISE ZERO_DIVIDE;
		END IF;
		EXCEPTION
		WHEN INVALID_NUMBER THEN
		GOTO LB1; -- 如果跳转到 LB2 则报错,即:goto 语句不能从 EXCEPTION 中跳转到当前的语句块中
		WHEN ZERO_DIVIDE THEN
		dbms_output.put_line('ZERO_DIVIDE');
	END;
END;
/
  2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21  1
2
ZERO_DIVIDE

PL/SQL procedure successfully completed.

SQL>
SQL> DECLARE
	I INT := 0;
BEGIN
	<<LB1>>
	I := I + 1;
	dbms_output.put_line(I);
	BEGIN
		<<LB2>>
		iF I = 1 THEN
			RAISE INVALID_NUMBER;
		ELSE
			RAISE ZERO_DIVIDE;
		END IF;
		EXCEPTION
		WHEN INVALID_NUMBER THEN
		GOTO LB2; -- 如果跳转到 LB2 则报错,即:goto 语句不能从 EXCEPTION 中跳转到当前的语句块中
		WHEN ZERO_DIVIDE THEN
		dbms_output.put_line('ZERO_DIVIDE');
	END;
END;
/

  2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21  		GOTO LB2; -- 如果跳转到 LB2 则报错,即:goto 语句不能从 EXCEPTION 中跳转到当前的语句块中
		*
ERROR at line 16:
ORA-06550: line 16, column 3:
PLS-00375: illegal GOTO statement; this GOTO cannot branch to label 'LB2'
ORA-06550: line 16, column 3:
PL/SQL: Statement ignored


SQL>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java常见漏洞——整数溢出漏洞、硬编码密码漏洞、不安全的随机数生成器

目录 前言&#xff1a; &#xff08;一&#xff09;整数溢出漏洞 0x01 整数溢出漏洞介绍 1.1 上界溢出 1.2 下界溢出 0x02 整数溢出漏洞修复 &#xff08;二&#xff09;硬编码密码漏洞 修复案例&#xff1a; &#xff08;三&#xff09;不安全的随机数生成器 前言&a…

1、Shell 概述

文章目录1、Shell 概述1.1 Linux 提供的 Shell 解析器有1.2 bash 和 sh 的关系1.3 Centos 默认的解析器是 bash尚硅谷2022版Linux扩展篇Shell教程-讲师&#xff1a;武晟然 壁立千仞 无欲则刚 1、Shell 概述 硬件–>操作系统核心&#xff08;Linux内核&#xff09;–>解释…

ubuntu2004 有线与另一个Ubuntu系统通信

在Ubuntu2004&#xff08;从机&#xff09;打开一个终端&#xff0c;输入如下配置有线网络ip&#xff0c;其中eth0 为有线网络的名称,up使能有线网络eth0&#xff1a; ifconfig eth0 192.169.10.2 up 并在.bashrc文件中输入 export ROS_MASTER_URIhttp://192.169.10.1:11311 …

Java多线程之线程池

Java高并发应用开发过程中会频繁的创建和销毁线程&#xff0c;为了节约成本和提升性能&#xff0c;往往会使用线程池来统一管理线程&#xff0c;使用线程池主要有以下几点优势 降低资源消耗&#xff1a;重复利用已创建的线程降低线程创建和销毁造成的消耗 提高响应速度&#xf…

ImageNet classification with deep convolutional neural networks

使用深度卷积神经网络进行ImageNet图像分类 目录 1.引言 2.网络结构 2.1 小细节 2.2 代码部分 3. 创新点 3.1 非线性激活函数ReLU&#xff08;提速&#xff09; 3.2 多GPU训练&#xff08;提速&#xff09; 3.3局部响应归一化&#xff08;增强泛化能力&#xff0c;已不…

我国天宫空间站以及各个仓位介绍

一、天宫空间站 天宫空间站&#xff08;China Space Station&#xff09;是中国从2021年开始建设的一个模块化空间站系统&#xff0c;为人类自1986年的和平号空间站及1998年的国际空间站后所建造的第三座大型在轨空间实验平台&#xff0c;基本构型由天和核心舱、问天实验舱和梦…

Head First设计模式(阅读笔记)-07.适配器模式

火鸡冒充鸭子 现在缺少一个绿头鸭对象&#xff0c;需要用野生火鸡对象冒充一下&#xff0c;但是二者的接口都不一样该怎么去冒充呢&#xff1f; // 鸭子接口 public interface Duck{public void quack(); // 呱呱叫public void fly(); // 飞行 } // 火鸡接口 public interfac…

应力奇异,你是一个神奇的应力!

在用ANSYS进行压力容器应力分析计算的时候&#xff0c;总会出现一些应力集中的问题&#xff0c;而且&#xff0c;有些应力集中点竟然没办法采用倒圆角的办法消除&#xff0c;采用网格加密方法时&#xff0c;甚至应力值比之前更大。这个情况&#xff0c;大家通常称为应力奇异。 …

springboot-mybatisplus-redis二级缓存

前言 mybatis可以自己带有二级缓存的实现&#xff0c;这里加上redis是想把东西缓存到redis中&#xff0c;而不是mybaits自带的map中。这也就构成了我们看到的springboot mybatisplus redis实现二级缓存的题目。 具体步骤如下&#xff1a; 首先加入需要的依赖 <dependenc…

《InnoDB引擎六》InnoDB 1.0.x版本之前的Master Thread

Master Thread 工作方式 在后台线程中提到&#xff0c;Master Thread是核心的后台线程。InnoDB存储引擎的主要工作都是在一个单独线程中完成的。 InnoDB 1.0.x版本之前的Master Thread Master Thread具有最高的线程优先级别。内部由多个循环组成&#xff1a;主循环(loop)、后台…

[附源码]SSM计算机毕业设计医院仪器设备管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于萤火虫算法优化的BP神经网络预测模型(Matlab代码实现)

目录 1 概述 2 萤火虫算法 3 萤火虫算法优化BP神经网络的算法设计 3.1 基本思想 3.2 萤火虫算法优化BP神经网络算法 4 运行结果 5 参考文献 6 Matlab代码及文章 1 概述 现实的世界中混沌现象无处不在,大至宇宙,小到基本粒子,都受到混沌理论支配.如气候变化会出 现混沌…

(三)DepthAI-python相关接口:OAK Nodes

消息快播&#xff1a;OpenCV众筹了一款ROS2机器人rae&#xff0c;开源、功能强、上手简单。来瞅瞅~ 编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查…

[MySQL]-压力测试_TPCC-MySQL

[MySQL]-压力测试_TPCC-MySQL 森格 | 2022年10月 对数据库学习来说&#xff0c;压力测试也是十分必要的一环&#xff0c;本文章主要介绍了TPCC-MySQL这个工具的使用。 一、基本概念 1.1 基准测试VS压力测试 基准测试&#xff1a; 直接简单、易于比较&#xff0c;用于评估服务…

CAD必练图形

这次我们用CAD梦想画图软件绘制一个CAD新手必练图形&#xff0c;它用到的有CAD矩形、直线、圆弧、等分等命令结合起来完成绘制的&#xff0c;可以跟着一起操作一下。 目标图形 操作步骤 1.使用CAD矩形命令&#xff08;快捷键&#xff1a;REC&#xff09;绘制一个长80宽30的矩…

为什么macbook不能删除u盘里东西?苹果电脑如何删除u盘文件

为什么macbook不能删除u盘里东西&#xff1f;有时候&#xff0c;我们会发现U盘不能够在Mac上正常使用&#xff0c;只能够读取U盘上的文件数据&#xff0c;但是若想要对其进行删除或者是编辑操作&#xff0c;完全不能够实现&#xff0c;本文为大家详细介绍了不同情况的不同解决方…

云原生主题学习月|共同学习全球领先的亚马逊云科技云原生课程,组团共学拿奖励~

CSDN 已上线亚马逊云科技超过 60 门中文数字化培训课程&#xff0c;希望为学习者提供亚马逊云科技基础技能知识和最佳实践。 每门课程时长从十分钟到几小时不等&#xff0c;由亚马逊云科技专家打造&#xff0c;其中包括最受欢迎的《亚马逊云科技云从业者必修知识》&#xff0c…

vue3发送验证码倒计时 (防止连点、封装复用)

一、实现思路 倒计时 流程图二、实现一个简单的验证码倒计时 //倒计时初始变量 const codeNum ref(60); // 定时器id let clearId: number; // 发送验证码 const sendCode async () > { // 防止下次点击 如果倒计时的时间不是60 就不执行下面逻辑if (codeNum.value ! 60)…

AcWing算法学习第三节---高精度问题.

系列文章目录 第一节快速排序 第二节二分法 学习路上的风景&#xff0c;我陪你一起去看&#xff0c;编程路上的算法&#xff0c;我陪你一起去学&#xff0c;朋友们你们好&#xff0c;我是夏目浅石&#xff0c;蟹蟹你点开文章和我一同进步&#xff0c;加油&#xff01;遇见更好…

2022Q3手机配件增长榜:手机壳、数据线等供求不断增加

本篇我们将继续来分析22年Q3季度中手机通讯行业的高增长概念。在手机通讯行业中&#xff0c;我们发现了3个高增长品类&#xff0c;分别是&#xff1a;手机耳机、手机壳、数据线。 一、手机配件类高增长概念——手机耳机 手机耳机可以分为不同种类&#xff0c;如&#xff1a;开放…