循环语句

简单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;
/
意见反馈
编组 3备份
    openGauss 2024-12-05 00:53:51
    取消