更新时间:2024-05-07 GMT+08:00
循环语句
简单LOOP语句
语法图
图1 loop::=
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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语句就会不停的在一系列语句上进行循环,在每次进入循环体的时候进行条件判断。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
CREATE TABLE integertable(c1 integer) DISTRIBUTE BY hash(c1); 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,否则循环体不会被执行。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
--从0到5进行循环 CREATE OR REPLACE PROCEDURE proc_for_loop() AS BEGIN FOR I IN 0..5 LOOP DBE_OUTPUT.PRINT_LINE('It is '||to_char(I) || ' time;') ; END LOOP; END; / --调用函数 CALL proc_for_loop(); --删除存储过程 DROP PROCEDURE proc_for_loop; |
FOR_LOOP查询语句
语法图
图4 for_loop_query::=
变量target会自动定义,类型和query的查询结果的类型一致,并且只在此循环中有效。target的取值就是query的查询结果。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
--循环输出查询结果。 CREATE OR REPLACE PROCEDURE proc_for_loop_query() AS record VARCHAR2(50); BEGIN FOR record IN SELECT spcname FROM pg_tablespace LOOP dbe_output.print_line(record); END LOOP; END; / --调用函数 CALL proc_for_loop_query(); --删除存储过程 DROP PROCEDURE proc_for_loop_query; |
FORALL批量查询语句
语法图
图5 forall::=
变量index会自动定义为integer类型并且只在此循环里存在。index的取值介于low_bound和upper_bound之间。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
CREATE TABLE TEST_t1 ( title NUMBER(6), did VARCHAR2(20), data_period VARCHAR2(25), kind VARCHAR2(25), interval VARCHAR2(20), time DATE, isModified VARCHAR2(10) ) DISTRIBUTE BY hash(did); INSERT INTO TEST_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 TEST_t1 set title = title + 100*i; END; / --调用函数 CALL proc_forall(); --查询存储过程调用结果 SELECT * FROM TEST_t1 WHERE title BETWEEN 100 AND 120; --删除存储过程和表 DROP PROCEDURE proc_forall; DROP TABLE TEST_t1; |
父主题: 控制语句