循环语法
相比于原始的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