VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

循环语句

简单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)