循环语句
简单LOOP语句
语法图
图 1 loop::=
示例
CREATE OR REPLACE PROCEDURE proc_loop(i in integer, count out integer)
AS
BEGIN
count:=0;
LOOP
IF count > i THEN
raise info 'count is %. ', count;
EXIT;
ELSE
count:=count+1;
END IF;
END LOOP;
END;
/
CALL proc_loop(10,5);
须知:
该循环必须要结合EXIT使用,否则将陷入死循环。
WHILE_LOOP语句
语法图
图 2 while_loop::=
只要条件表达式为真,WHILE语句就会不停的在一系列语句上进行循环,在每次进入循环体的时候进行条件判断。
示例
CREATE TABLE integertable(c1 integer) ;
CREATE OR REPLACE PROCEDURE proc_while_loop(maxval in integer)
AS
DECLARE
i int :=1;
BEGIN
WHILE i < maxval LOOP
INSERT INTO integertable VALUES(i);
i:=i+1;
END LOOP;
END;
/
--调用函数
CALL proc_while_loop(10);
--删除存储过程和表
DROP PROCEDURE proc_while_loop;
DROP TABLE integertable;
FOR_LOOP(integer变量)语句
语法图
图 3 for_loop::=
说明:
- 变量name会自动定义为integer类型并且只在此循环里存在。变量name介于lower_bound和upper_bound之间。
- 当使用REVERSE关键字时,lower_bound必须大于等于upper_bound,否则循环体不会被执行。
FOR_LOOP查询语句
语法图
图 4 for_loop_query::=
说明:
变量target会自动定义,类型和query的查询结果的类型一致,并且只在此循环中有效。target的取值就是query的查询结果。
FORALL批量查询语句
语法图
图 5 forall::=
说明:
- 变量index会自动定义为integer类型并且只在此循环里存在。index的取值介于low_bound和upper_bound之间。
- 如果声明了SAVE EXCEPTIONS,则会将循环体DML执行过程中每次遇到的异常保存在SQL&BULK_EXCEPTIONS中,并在执行结束后统一抛出一个异常,循环过程中没有异常的执行的结果在当前子事务内不会回滚。
示例
CREATE TABLE hdfs_t1 (
title NUMBER(6),
did VARCHAR2(20),
data_period VARCHAR2(25),
kind VARCHAR2(25),
interval VARCHAR2(20),
time DATE,
isModified VARCHAR2(10)
);
INSERT INTO hdfs_t1 VALUES( 8, 'Donald', 'OConnell', 'DOCONNEL', '650.507.9833', to_date('21-06-1999', 'dd-mm-yyyy'), 'SH_CLERK' );
CREATE OR REPLACE PROCEDURE proc_forall()
AS
BEGIN
FORALL i IN 100..120
update hdfs_t1 set title = title + 100*i;
END;
/
--调用函数
CALL proc_forall();
--查询存储过程调用结果
SELECT * FROM hdfs_t1 WHERE title BETWEEN 100 AND 120;
--删除存储过程和表
DROP PROCEDURE proc_forall;
DROP TABLE hdfs_t1;
LABEL_LOOP语句
语法格式
[label_begin:] LOOP
statements
END LOOP [label_end]
说明:
在简单loop语句的基础上增加了label标签的用法,标签规则如下:
- label_begin可以单独出现(不加label_end),但是使用label_end,就必须有与之相同的label_begin。
- 标签可以被continue或exit语句引用,特别的是,在数据库模式为’B’时,也可用iterate或leave语句。
须知:
该循环只在数据库兼容模式为’B’时使用,其他模式下报错。必须要结合EXIT使用(’B‘模式下可使用’LEAVE‘,与EXIT效果相同;’B‘模式下可使用’ITERATE’,与CONTINUE效果相同),否则将陷入死循环。
示例
CREATE OR REPLACE PROCEDURE label_loop(i in integer, count out integer)
AS
BEGIN
count:=0;
label:
LOOP
IF count > i THEN
raise info 'count is %. ', count;
LEAVE;
ELSE
count:=count+1;
END IF;
END LOOP label;
END;
/
CALL proc_loop(10,5);
WHILE_DO语句
语法格式
[label_begin:] WHILE condition DO
statements
END WHILE [label_end]
说明:
只要条件表达式为真,WHILE语句就会不停的在一系列语句上进行循环,在每次进入循环体的时候进行条件判断。
标签规则如下:
- label_begin可以单独出现(不加label_end),但是使用label_end,就必须有与之相同的label_begin。
- 标签可以被continue或exit语句引用,特别的是,在数据库模式为’B’时,也可用iterate或leave语句。
须知: 该循环只在数据库兼容模式为’B’时使用,其他模式下报错。
示例
create or replace procedure while_test()
as
declare _i integer = 0;
BEGIN
the_while:
while _i < 10 do
_i := _i + 1;
continue the_while when _i % 2 = 0;
raise notice '%', _i;
end while the_while;
end;
/
select while_test();
REPEAT语句
语法格式
[label_begin:] REPEAT
statements
UNTIL condition
END REPEAT [label_end]
说明:
只要条件表达式为真,WHILE语句就会停止在一系列语句上进行循环,在每次进入循环体的时候进行条件判断。
标签规则如下:
- label_begin可以单独出现(不加label_end),但是使用label_end,就必须有与之相同的label_begin。
- 标签可以被continue或exit语句引用,特别的是,在数据库模式为’B’时,也可用iterate或leave语句。
须知: 该循环只在数据库兼容模式为’B’时使用,其他模式下报错。
示例
CREATE or replace PROCEDURE dorepeat(p1 INT)
as
declare
i int =0;
BEGIN
label:
repeat
i = i + 1;
until i >p1 end repeat label;
raise notice '%',i;
end;
/