openGauss
开源数据库
openGauss社区官网
开源社区
openGauss社区入门(openGauss-循环语句)
2022-09-30openGauss社区开发入门
LOOP 语句
1.与 label 标签名连用,可使用 continue 或者 iterate + label 标签名跳出本次循环,重新开始下一次循环;可使用 exit/leave + label 标签名 退出循环
CREATE OR REPLACE PROCEDURE prc_loop(i in integer, count out integer)
AS
BEGIN
count:=0;
label1:
LOOP
IF count > i THEN
raise info 'count is %. ', count;
LEAVE label1;
ELSE
count:=count+1;
END IF;
IF count < 7 THEN
ITERATE label1;
ELSE
raise info 'greater than 7';
END IF;
END LOOP label1;
END;
/
CALL prc_loop(10,5);
INFO: greater than 7
INFO: greater than 7
INFO: greater than 7
INFO: greater than 7
INFO: greater than 7
INFO: count is 11.
count
-----
11
(1 row)
2.可用于存储过程带有自治事务、自定义函数、游标、触发器等环境中 举例:
CREATE FUNCTION func_loop(a int,b int,i int) return int
AS
BEGIN
LOOP
i=i-1;
IF i>4 then
CONTINUE;
END IF;
a=a+b;
IF i<2 then
EXIT;
END IF;
END LOOP;
RETURN a;
END;
/
CALL func_loop(1,2,7);
func_loop
--------
9
(1 row)
WHILE_LOOP 语句
在每次循环开始判断,若为真值,继续循环,反之,退出循环。 举例:
CREATE OR REPLACE PROCEDURE proc_while_loop(a int,b out int)
AS
DECLARE
i int :=1;
BEGIN
WHILE i <a LOOP
raise info '循环%次. ', i;
i:=i+1;
END LOOP;
raise info 'i is %. ', i;
b=i;
END;
/
CALL proc_while_loop(5,6);
INFO: 循环1次.
INFO: 循环2次.
INFO: 循环3次.
INFO: 循环4次.
INFO: i is 5.
b
--
5
(1 row)
FOR_LOOP 语句
1.int 类型变量
变量指定起始位置 min,遍历到达指定终点位置 max,其中 max>=min. 举例:
CREATE OR REPLACE PROCEDURE proc_for_loop(sum out int)
AS
BEGIN
sum:=0;
FOR a IN 5..15 LOOP
sum=a+sum;
raise info '循环%次,和为%.', a-4,sum;
END LOOP;
END;
/
CALL proc_for_loop();
INFO: 循环1次,和为5.
INFO: 循环2次,和为11.
INFO: 循环3次,和为18.
INFO: 循环4次,和为26.
INFO: 循环5次,和为35.
INFO: 循环6次,和为45.
INFO: 循环7次,和为56.
INFO: 循环8次,和为68.
INFO: 循环9次,和为81.
INFO: 循环10次,和为95.
INFO: 循环11次,和为110.
sum
---
110
(1 row)
2.查询语句变量
变量会自动定义,类型和查询结果的类型一致,并且只在此循环中有效。target 的取值就是查询结果。
CREATE TABLE tb_select(id int,name text);
INSERT INTO tb_select VALUES(1,'lili'),(2,'kiko'),(3,'MING');
CREATE OR REPLACE PROCEDURE proc_for_loop_query(count out int)
AS
record text;
BEGIN
count=0;
FOR record IN SELECT name FROM tb_select LOOP
count=count+1;
raise info '名字是%.',record;
END LOOP;
END;
/
CALL proc_for_loop_query(9);
INFO: 名字是lili.
INFO: 名字是kiko.
INFO: 名字是MING.
count
-----
3
(1 row)