写点什么

一文详解数仓 GassDB(DWS) 函数出参带出方式

  • 2023-02-10
    中国香港
  • 本文字数:1114 字

    阅读完需:约 4 分钟

一文详解数仓GassDB(DWS) 函数出参带出方式

本文分享自华为云社区《GassDB(DWS)功能 -- 函数出参 #【玩转PB级数仓GaussDB(DWS)】》,作者:譡里个檔 。


DWS 的 PL/pgSQL 函数/存储过程中有一个特殊的语法 PERFORM 语法,用于执行语句但是丢弃执行结果的场景,常用于一些状态判断的场景。但是客户往往会不当使用 PERFORM 语法,导致业务逻辑出错,最常见的就是使用 PERFORM 执行带有出参的函数。


已知函数 inner 定义如下


CREATE OR REPLACE FUNCTION public.inner(    IN a1 integer,     IN b1 integer,     OUT a integer,     OUT b integer) RETURNS record LANGUAGE plpgsql NOT FENCED NOT SHIPPABLEAS $function$ DECLAREBEGIN    a := a1;    b := b1;END$function$;
复制代码


函数 f_outer 定义如下,函数体中调用函数 inner,把函数的出参赋值给变量 a, b


CREATE OR REPLACE FUNCTION public.f_outer(IN i_a int, IN i_b int) RETURNS void LANGUAGE plpgsql NOT FENCED NOT SHIPPABLEAS $function$ DECLARE    a int;    b int;BEGIN    PERFORM public.inner(i_a, i_b, a, b);    RAISE INFO 'a = %, b = %', a, b;END$function$;
复制代码


但是实际执行的时候发现函数 inner 的出参没有正确赋值(预期值为 a = 1 b = 11)。


postgres=# CALL f_outer(1, 11);INFO:  a = <NULL>, b = <NULL>SQLSTATE: 00000 f_outer---------
(1 row)
Time: 1.086 ms
复制代码


出现这种问题的原因是 PERFORM 语法会执行 SQL 语句,但是会抛弃执行结果,导致函数出参没有赋值


DWS 中常用的带出函数出参的方式有以下三种:


  • 方式 1:函数出参的方式赋值


CREATE OR REPLACE FUNCTION public.test1(IN i_a int, IN i_b int) RETURNS void LANGUAGE plpgsql NOT FENCED NOT SHIPPABLEAS $function$ DECLARE    a int;    b int;BEGIN    public.inner(i_a, i_b, a, b);    RAISE info 'a = %, b = %', a, b;END$function$;
复制代码


  • 方式 2:动态查询语句方式赋值


CREATE OR REPLACE FUNCTION public.test2(IN i_a int, IN i_b int) RETURNS void LANGUAGE plpgsql NOT FENCED NOT SHIPPABLEAS $function$ DECLARE    a int;    b int;BEGIN    EXECUTE IMMEDIATE 'SELECT * from public.inner(:1, :2)' UNSING INTO a, b USING IN i_a, i_b;    RAISE INFO 'a = %, b = %', a, b;END$function$;
复制代码


  • 方式 3:SELECT .. INTO 赋值


CREATE OR REPLACE FUNCTION public.test3(IN i_a int, IN i_b int) RETURNS void LANGUAGE plpgsql NOT FENCED NOT SHIPPABLEAS $function$ DECLARE    a int := 0;    b int := 0;BEGIN    SELECT * INTO a, b FROM public.inner(i_a, i_b);    RAISE INFO 'a = %, b = %', a, b;END$function$;
复制代码

点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
一文详解数仓GassDB(DWS) 函数出参带出方式_数据库_华为云开发者联盟_InfoQ写作社区