其他语句
功能描述
其他语句包括NULL语句、LABEL声明语句和变量声明的继承语句。
NULL语句
NULL语句不做任何语义上的执行,一般出现在空函数体或者空循环体内。语法格式如下:
NULL;
LABEL声明语句
- 注意事项
- 在匿名块、函数体、触发器定义中,LABEL声明需要满足与goto语句之间的层次关系。
- LABEL不可以出现在goto语句处未知的循环中,错误示例1
- LABEL不可以出现在goto语句处未知的判断中,错误示例2
- LABEL不可以出现在goto语句处冲突的判断中,错误示例3
- LABEL不可以出现在goto语句处冲突的case中,错误示例4
- LABEL不可以出现在goto语句处未知的BEGIN语句中,错误示例5
- LABEL不可以出现在goto语句处未知的EXCEPTION语句中,错误示例6
- LABEL不可以两个名称相同,错误示例7
- 在匿名块定义中,LABEL声明如果出现关键字Declare前,则被认为是匿名块的名字。
- LABEL声明如果出现在循环体(LOOP/FOR/WHILE)前,则被认为是循环体的名字。
- 语法格式
<<label_name>>
- 参数说明
label_name
标签名。
- 示例(LABEL语句以粗体显示)
<<main>> DECLARE aaa NUMBER; j NUMBER; bbb NUMBER; BEGIN aaa := 2; j := 1; bbb := 0; <<outer_loop>> bbb := bbb + 1; DBMS_OUTPUT.PUT_LINE('bbb:' || bbb); FOR i IN 1..5 LOOP DBMS_OUTPUT.PUT_LINE('i:' || i); <<inner_loop>> WHILE j < 6 LOOP DBMS_OUTPUT.PUT_LINE('j:' || j); j := j + 1; FOR k IN 1..5 LOOP DBMS_OUTPUT.PUT_LINE('k:' || k); FOR l IN 1..5 LOOP DBMS_OUTPUT.PUT_LINE('l:' || l); EXIT inner_loop WHEN bbb = 2; GOTO outer_loop; END LOOP; END LOOP; END LOOP; END LOOP; END; /
错误示例1
DECLARE bbb NUMBER; BEGIN bbb := 1; DBMS_OUTPUT.PUT_LINE('bbb:' || bbb); GOTO my_label; FOR i IN 1..5 LOOP <<my_label>> bbb := bbb + 1; DBMS_OUTPUT.PUT_LINE('bbb:' || bbb); END LOOP; END; /
错误示例2
DECLARE bbb NUMBER; BEGIN bbb := 1; DBMS_OUTPUT.PUT_LINE('bbb:' || bbb); GOTO my_label; IF bbb = 1 THEN <<my_label>> DBMS_OUTPUT.PUT_LINE('bbb = 1'); bbb := bbb + 1; ELSIF bbb = 2 THEN DBMS_OUTPUT.PUT_LINE('bbb = 2'); END IF; END; /
错误示例3
DECLARE bbb NUMBER; BEGIN bbb := 1; DBMS_OUTPUT.PUT_LINE('bbb:' || bbb); IF bbb = 1 THEN <<my_label>> DBMS_OUTPUT.PUT_LINE('bbb = 1'); bbb := bbb + 1; ELSIF bbb = 2 THEN GOTO my_label; DBMS_OUTPUT.PUT_LINE('bbb = 2'); END IF; END; /
错误示例4
DECLARE bbb NUMBER; BEGIN bbb := 3; DBMS_OUTPUT.PUT_LINE('bbb:' || bbb); CASE bbb WHEN 1 THEN <<my_label>> DBMS_OUTPUT.PUT_LINE('bbb = 1'); bbb := bbb + 1; WHEN 2 THEN DBMS_OUTPUT.PUT_LINE('bbb = 2'); bbb := bbb + 1; GOTO my_label; ELSE DBMS_OUTPUT.PUT_LINE('bbb = 3'); END CASE; END; /
错误示例5
DECLARE aaa NUMBER; BEGIN aaa := 2; GOTO my_label; BEGIN <<my_label>> DBMS_OUTPUT.PUT_LINE('aaa:' || aaa); END; aaa := 3; END; /
错误示例6
DECLARE aaa NUMBER; BEGIN aaa := 2; BEGIN FOR l IN 1..3 LOOP GOTO my_label; DBMS_OUTPUT.PUT_LINE('l:' || l); END LOOP; END; aaa := 3; EXCEPTION when no_data_found then <<my_label>> dbms_output.put_line(aaa); END; /
错误示例7
DECLARE aaa NUMBER; BEGIN aaa := 2; <<my_label>> FOR l IN 1..3 LOOP GOTO my_label; DBMS_OUTPUT.PUT_LINE('l:' || l); END LOOP; <<my_label>> aaa := 3; END; /
变量声明的继承语句
- 注意事项
- %ROWTYPE支持继承以下变量的数据类型:表、游标变量。
- 使用%ROWTYPE继承数据类型后,变量统一为记录变量,其内部列数和数据类型与所继承变量的列数和数据类型一致。
- %TYPE支持继承以下变量的数据类型:列(格式为“表名.列名”)、记录变量、普通变量。
- 使用%TYPE继承数据类型后,变量统一为普通变量。
- 语法格式
%ROWTYPE %TYPE
- 示例(变量声明的继承语句以粗体显示)
--删除已存在的同名表。 DROP TABLE IF EXISTS emp_test;
--创建表emp_test。 CREATE TABLE emp_test(empno int, ename varchar(50), sal int);
--向表emp_test中插入数据。 INSERT INTO emp_test VALUES(123, 'abc', 456); --提交事务。 COMMIT;
--声明变量。 DECLARE cv SYS_REFCURSOR; v_empno emp_test.empno%TYPE; v_ename emp_test.ename%TYPE; v_sal emp_test.sal%TYPE; query_2 VARCHAR2(200) := 'SELECT * FROM emp_test ORDER BY 1,2,3'; v_emp_test emp_test%ROWTYPE; BEGIN OPEN cv FOR SELECT empno,ename FROM emp_test ORDER BY empno; LOOP FETCH cv INTO v_empno, v_ename; EXIT WHEN cv%NOTFOUND; DBMS_OUTPUT.PUT_LINE(rpad(v_empno,25,' ')||v_ename); END LOOP; DBMS_OUTPUT.PUT_LINE( '-------------------------------------' ); CLOSE cv; END; /
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」关注作者【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。评论