Greenplum plpgsql函数中exit存在无法跳出循环的BUG

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

Greenplum中如果使用循环,并且内部嵌套了子块,在子块中的exit只能跳出子块,不能跳出子块外面的循环。

CREATE OR REPLACE FUNCTION test1(i integer) RETURNS 
integer AS 

$$

DECLARE count int;
BEGIN
    count := 1;
    LOOP
        count := count + 1;

        begin
            raise notice 'sub xact: %', count;
            EXECUTE 'select 1';
            IF count > 10 THEN
                EXIT;  -- BUG在这里, 只跳出了begin, 没有跳出LOOP
                raise notice 'sub xact if: %', count;
            END IF;
            raise notice 'sub xact end if: %', count;
        exception when others then
        end;

        raise notice 'parent xact: %', count;
    END LOOP;
    return 1;
END

$$
 LANGUAGE plpgsql;

postgres=# select test1(1);
NOTICE:  sub xact: 2
NOTICE:  sub xact end if: 2
NOTICE:  parent xact: 2
NOTICE:  sub xact: 3
NOTICE:  sub xact end if: 3
NOTICE:  parent xact: 3
NOTICE:  sub xact: 4
NOTICE:  sub xact end if: 4
NOTICE:  parent xact: 4
NOTICE:  sub xact: 5
NOTICE:  sub xact end if: 5
NOTICE:  parent xact: 5
NOTICE:  sub xact: 6
NOTICE:  sub xact end if: 6
NOTICE:  parent xact: 6
NOTICE:  sub xact: 7
NOTICE:  sub xact end if: 7
NOTICE:  parent xact: 7
NOTICE:  sub xact: 8
NOTICE:  sub xact end if: 8
NOTICE:  parent xact: 8
NOTICE:  sub xact: 9
NOTICE:  sub xact end if: 9
NOTICE:  parent xact: 9
NOTICE:  sub xact: 10
NOTICE:  sub xact end if: 10
NOTICE:  parent xact: 10
NOTICE:  sub xact: 11
NOTICE:  parent xact: 11
NOTICE:  sub xact: 12
NOTICE:  parent xact: 12
NOTICE:  sub xact: 13
NOTICE:  parent xact: 13
NOTICE:  sub xact: 14
NOTICE:  parent xact: 14

CREATE OR REPLACE FUNCTION test1(i integer) RETURNS 
integer AS 

$$

DECLARE count int;
BEGIN
    count := 1;
    LOOP
        count := count + 1;

        begin
            raise notice 'sub xact: %', count;
            EXECUTE 'select 1';
            IF count > 10 THEN
                return 0;  -- 改成return, 退出整个函数, 如果要跳出loop, 应该在loop内控制。不能放在LOOP内的sub block执行。
            END IF;
        exception when others then
        end;

        raise notice 'parent xact: %', count;
    END LOOP;
    return 1;
END

$$
 LANGUAGE plpgsql;

postgres=# select test1(1);
NOTICE:  sub xact: 2
NOTICE:  parent xact: 2
NOTICE:  sub xact: 3
NOTICE:  parent xact: 3
NOTICE:  sub xact: 4
NOTICE:  parent xact: 4
NOTICE:  sub xact: 5
NOTICE:  parent xact: 5
NOTICE:  sub xact: 6
NOTICE:  parent xact: 6
NOTICE:  sub xact: 7
NOTICE:  parent xact: 7
NOTICE:  sub xact: 8
NOTICE:  parent xact: 8
NOTICE:  sub xact: 9
NOTICE:  parent xact: 9
NOTICE:  sub xact: 10
NOTICE:  parent xact: 10
NOTICE:  sub xact: 11
 test1 
-------
     0
(1 row)

在PostgreSQL中不存在这个问题。 使用GP时需要注意一下。

相关文章
|
存储 关系型数据库 MySQL
MySQL控制流函数-if 、elseif、else、case...when
MySQL控制流函数-if 、elseif、else、case...when
221 0
MySQL控制流函数-if 、elseif、else、case...when
|
存储 关系型数据库 MySQL
MySQL的存储过程——流程控制-while、repeat、loop循环
MySQL的存储过程——流程控制-while、repeat、loop循环
508 0
MySQL的存储过程——流程控制-while、repeat、loop循环
|
2月前
break语句和continue语句的区别
break语句和continue语句的区别
11 0
|
3月前
|
SQL
SQL语句case when的用法
SQL语句case when的用法
|
11月前
|
Python
16.从入门到精通:range() 函数 break 和 continue 语句及循环中的 else 子句 break语句 continue语句 循环中的else子句 pass 语句
16.从入门到精通:range() 函数 break 和 continue 语句及循环中的 else 子句 break语句 continue语句 循环中的else子句 pass 语句
|
编译器 C语言 开发者
break 语句和 continue 语句|学习笔记
快速学习 break 语句和 continue 语句
106 0
break 语句和 continue 语句|学习笔记
|
SQL
在tp5.1 fetchSql打印出执行的sql语句
在tp5.1 fetchSql打印出执行的sql语句
254 0
在tp5.1 fetchSql打印出执行的sql语句
|
SQL BI
SQL利用Case When Then多条件判断
CASE     WHEN 条件1 THEN 结果1     WHEN 条件2 THEN 结果2     WHEN 条件3 THEN 结果3     WHEN 条件4 THEN 结果4 .........     WHEN 条件N THEN 结果N     ELSE 结果X END Case具有两种格式。
6389 0
|
SQL 数据库
三分钟搞懂SQL的Case函数
三分钟搞懂SQL的Case函数
162 0
三分钟搞懂SQL的Case函数
|
SQL Java 程序员
判断是否"存在",还在用count?试试这条SQL语句,性能杠杠的!
判断是否"存在",还在用count?试试这条SQL语句,性能杠杠的!
152 0