OpenGauss中循环语句

在 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;
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值