循环语句
简单LOOP语句
语法图
loop::=
示例
创建存储过程 proc_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);
当结果显示如下信息,则表示loop验证成功。
INFO: count is 11.
count
-------
11
(1 row)
该循环必须要结合EXIT使用,否则将陷入死循环。
WHILE_LOOP语句
语法图
while_loop::=
只要条件表达式为真,WHILE语句就会不停的在一系列语句上进行循环,在每次进入循环体的时候进行条件判断。
示例
1、创建存储过程并调用。
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);
2、查询表数据验证结果。
select * from integertable;
当结果显示如下信息,则表示循环插入成功。
c1
-------
1
2
3
4
5
6
7
8
9
(9 rows)
FOR_LOOP(integer变量)语句
语法图
for_loop::=
变量name会自动定义为integer类型并且只在此循环里存在。变量name介于lower_bound和upper_bound之间。
当使用REVERSE关键字时,lower_bound必须大于等于upper_bound,否则循环体不会被执行。
FOR_LOOP查询语句
语法图
for_loop_query::=
变量target会自动定义,类型和query的查询结果的类型一致,并且只在此循环中有效。target的取值就是query的查询结果。
FORALL批量查询语句
语法图
forall::=
变量index会自动定义为integer类型并且只在此循环里存在。index的取值介于low_bound和upper_bound之间。
示例
1、创建测试表并插入数据。
CREATE TABLE hdfs_t1 ( title NUMBER(6), did VARCHAR2(20), data_peroid 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' );
2、创建存储过程并调用。
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();
3、查询存储过程调用结果
SELECT * FROM hdfs_t1 ;
当结果显示如下信息,则表示循环调用成功。
title | did | data_peroid | kind | interval | time | ismodified --------+--------+-------------+----------+--------------+---------------------+------------ 231008 | Donald | OConnell | DOCONNEL | 650.507.9833 | 1999-06-21 00:00:00 | SH_CLERK (1 row)
4、删除存储过程和表。
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);
返回结果如下:
INFO: count is 11. count ------- 11 (1 row)