VastbaseG100

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

Menu

循环语法

相比于原始的Vastbase,在MySQL兼容模式下新增如下循环语句(原Vastbase的循环语句请参考循环语句):

LABEL_LOOP语句

功能描述

LOOP语法用于控制函数或存储过程中使语句进入循环并执行语句。Vastbase在MySQL兼容模式下支持LOOP循环时使用以下功能:

  • 支持在循环开始前使用标签名+冒号的语法,使用label标签。
  • 支持在循环结束后,使用标签名的语法。
  • 支持在循环体内部,通过ITERATE关键字中断本次循环,进入下一次循环,与CONTINUE效果相同。
  • 支持在循环体内部,使用LEAVE关键字退出循环,与EXIT效果相同。

注意事项

  • 该功能仅在数据库兼容模式为MySQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='B')。
  • 代码块标签必须放在 DECLARE 的前面。
  • LABEL:与 BEGIN 或者 DECLARE 之间要有空格。

语法格式

[label_begin:] 
LOOP statements
END LOOP [label_end]

在简单loop语句的基础上增加了label标签的用法,标签规则如下:

  • label_begin可以单独出现(不加label_end),但是使用label_end,就必须有与之相同的label_begin。
  • 标签可以被continue或exit语句引用,也可以使用iterate或leave语句。

参数说明

  • label_begin

    开始标签。

  • statements

    函数或存储过程中执行的语句。

  • label_end

    结束标签。

示例

示例1: 存储过程中使用LOOP。

1、创建测试表。

create table looptest_tab(a int);

2、创建存储过程验证LOOP中使用标签。

CREATE PROCEDURE loop_proc(a int) 
as 
BEGIN 
label1:
LOOP 
a:=a+1; 
if a<5 then 
insert into looptest_tab values(a);
ITERATE label1; 
END if; 
LEAVE label1; 
END LOOP label1; 
END;
/

3、调用存储过程。

call loop_proc(1);

4、查询存储过程执行结果。

select * from looptest_tab order by a;

结果显示如下:

 a 
---
 2
 3
 4
(3 rows)

示例2: 函数中使用LOOP。

1、创建测试表。

create table looptest_fun(a int);

2、创建函数验证LOOP中使用标签。

create function loop_auto1(i int)returns int
as
$$
declare
pragma autonomous_transaction;
begin
label1:
loop
i:=i+1;
if i<10 then
insert into looptest_fun values(i);
commit;
iterate label1;
end if;
leave label1;
end loop label1;
return i;
end;
$$
language plpgsql;

3、调用函数。

call loop_auto1(2);

4、查询函数执行结果。

select * from looptest_fun order by a;

结果显示如下:

 a
---
 3
 4
 5
 6
 7
 8
 9
(7 rows)

示例3: 在函数中使用LABEL:标签。

1、创建函数funct。

create or replace function funct(v1 int,v2 int) return int as
begin
a3:
declare con int:=10;
begin
con=v1+v2+con;
return con;
end;
end;
/

2、调用函数。

call funct(10,-2);

返回结果如下:

 funct
-------
    18
(1 row)

WHILE_DO语句

语法格式

[label_begin:] WHILE condition DO
statements
END WHILE [label_end]
  • 只要条件表达式为真,WHILE语句就会停止在一系列语句上进行循环,在每次进入循环体的时候进行条件判断。
  • 标签规则如下:
    • label_begin可以单独出现(不加label_end),但是使用label_end,就必须有与之相同的label_begin。
    • 标签可以被continue或exit语句引用,也可使用iterate或leave语句。

注意事项

该功能仅在数据库兼容模式为MySQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='B')。

示例

1、创建存储过程使用WHILE_DO语句。

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; 
/

2、调用存储过程。

select while_test();

结果显示如下:

NOTICE:  1
CONTEXT:  referenced column: while_test
NOTICE:  3
CONTEXT:  referenced column: while_test
NOTICE:  5
CONTEXT:  referenced column: while_test
NOTICE:  7
CONTEXT:  referenced column: while_test
NOTICE:  9
CONTEXT:  referenced column: while_test
 while_test
------------

(1 row)

REPEAT语句

语法格式

[label_begin:] REPEAT
statements
UNTIL condition
END REPEAT [label_end]
  • 只要条件表达式为真,WHILE语句就会停止在一系列语句上进行循环,在每次进入循环体的时候进行条件判断。
  • 标签规则如下:
    • label_begin可以单独出现(不加label_end),但是使用label_end,就必须有与之相同的label_begin。
    • 标签可以被continue或exit语句引用,也可使用iterate或leave语句。

注意事项

该功能仅在数据库兼容模式为MySQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='B')。

示例

示例1: 在存储过程中使用REPEAT语句。

1、创建存储过程使用REPEAT语句。

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;
/

2、调用存储过程。

select dorepeat(1);

结果显示如下:

NOTICE:  2
CONTEXT:  referenced column: dorepeat
 dorepeat
----------

(1 row)

示例2: 在匿名块中使用REPEAT语句。

1、创建测试表并插入数据。

create table tab_1165775(id int,c1 varchar2(18));
insert into tab_1165775 values(1,'精卫填海'),(2,'女娲补天'),(3,'夸父追日'),(4,'盘古开天'),(5,'嫦娥奔月');

2、创建匿名块。

DECLARE
x int:=1;
n int;
video char(18);
begin
select count(*) into n from tab_1165775;
repeat
select c1 into video from tab_1165775 where id=x;
raise notice '%',video;
x:=x+1;
until x>n end repeat;
end;
/

返回结果如下:

NOTICE:  精卫填海
NOTICE:  女娲补天
NOTICE:  夸父追日
NOTICE:  盘古开天
NOTICE:  嫦娥奔月
ANONYMOUS BLOCK EXECUTE