在 OpenGauss(以及很多其他的 SQL 数据库系统中),循环语句不是 SQL 的一部分,因为 SQL 主要被设计为处理数据的查询、更新、插入和删除等操作,而不包括传统编程语言中的控制流语句(如循环和条件语句)。然而,OpenGauss 提供了 PL/pgSQL(PostgreSQL 的过程语言的一个变种,也被 OpenGauss 所支持)来允许开发者编写复杂的存储过程和函数,其中可以包含循环语句。
在 OpenGauss中,可以使用 LOOP、WHILE、FOR 循环等来控制程序流程。以下是这几种循环的示例:
参考官方文档地址
https://www.bookstack.cn/read/opengauss-5.0.0-zh/144ce1caea29b7a3.md
1、简单LOOP语句
CREATE OR REPLACE PROCEDURE sp_test_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 sp_test_loop(15,10);
注意: 该循环必须要结合EXIT使用,否则将陷入死循环。
2、WHILE_LOOP语句
只要满足条件表达式为真,WHILE语句就会不停的执行语句进行循环,在每次进入循环体的时候进行条件判断。
CREATE TABLE t_tab_while(id integer) ;
CREATE OR REPLACE PROCEDURE sp_while_loop(maxval in integer)
AS
DECLARE
i int :=1;
BEGIN
WHILE i < maxval LOOP
INSERT INTO t_tab_while VALUES(i);
i:=i+1;
END LOOP;
END;
/
--调用函数
CALL sp_while_loop(5);
superdb=> CALL sp_while_loop(5);
sp_while_loop
---------------
(1 row)
superdb=> select * from t_tab_while;
id
----
1
2
3
4
(4 rows)
--删除存储过程和表
DROP PROCEDURE sp_while_loop;
DROP TABLE t_tab_while;
3、FOR_LOOP
3.1、FOR_LOOP(integer变量)语句
说明:
- 变量name会自动定义为integer类型并且只在此循环里存在。变量name介于lower_bound和upper_bound之间。
- 当使用REVERSE关键字时,lower_bound必须大于等于upper_bound,否则循环体不会被执行。
declare i INT;
BEGIN
FOR i IN REVERSE 10..1 by 2 LOOP
RAISE NOTICE 'i 的值是 %', i;
END LOOP;
END ;
superdb$> /
NOTICE: i 的值是 10
NOTICE: i 的值是 8
NOTICE: i 的值是 6
NOTICE: i 的值是 4
NOTICE: i 的值是 2
ANONYMOUS BLOCK EXECUTE
3.2、FOR_LOOP查询语句
变量target会自动定义,类型和query的查询结果的类型一致,并且只在此循环中有效。target的取值就是query的查询结果
DECLARE i INT;
BEGIN
FOR i IN 1..5 LOOP
RAISE NOTICE 'i 的值是 %', i;
END LOOP;
END ;
superdb$> /
NOTICE: i 的值是 1
NOTICE: i 的值是 2
NOTICE: i 的值是 3
NOTICE: i 的值是 4
NOTICE: i 的值是 5
ANONYMOUS BLOCK execute
4、FORALL批量查询语句
说明:
- 变量index会自动定义为integer类型并且只在此循环里存在。index的取值介于low_bound和upper_bound之间。
- 如果声明了SAVE EXCEPTIONS,则会将循环体DML执行过程中每次遇到的异常保存在SQL&BULK_EXCEPTIONS中,并在执行结束后统一抛出一个异常,循环过程中没有异常的执行的结果在当前子事务内不会回滚。
CREATE TABLE t_tab_forall(id integer) ;
CREATE OR REPLACE PROCEDURE sp_forall()
AS
BEGIN
FORALL i IN 1..5
INSERT INTO t_tab_forall VALUES(i);
END;
/
--调用函数
CALL sp_forall();
superdb=> CALL sp_forall();
sp_forall
-----------
(1 row)
superdb=> select * from t_tab_forall;
id
----
1
2
3
4
5
(5 rows)
--删除存储过程和表
DROP PROCEDURE sp_foralll;
标签:语句,NOTICE,END,sp,while,循环,OpenGauss,LOOP
From: https://blog.csdn.net/zxrhhm/article/details/141639307