摘要:本文主要讲解DWS函数出参带出方式。

本文分享自华为云社区《GaussDB(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 SHIPPABLE
AS $function$
DECLARE
BEGIN
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 SHIPPABLE
AS $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 SHIPPABLE
AS $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 SHIPPABLE
AS $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 SHIPPABLE
AS $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$
;

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

最新文章

  1. xib自定义cell代码规范
  2. CORTEX -M3 : Registers in depth
  3. Unity NGUI和UGUI与模型、特效的层级关系
  4. 模块计算机类型“X64”与目标计算机类型“x86”冲突
  5. 【MySQL笔记】mysql来源安装/配置步骤和支持中国gbk/gb2312编码配置
  6. ValueStack背后的OGNL表达式
  7. java中byte, iso-8859-1, UTF-8,乱码的根源
  8. C#关于通过反射PropertyType判读字符串类型方法
  9. 【一天一道LeetCode】#75. Sort Colors
  10. linux 按文件大小排序
  11. vue配置手机通过IP访问电脑开发环境
  12. CISCO 关闭4786端口解决方法
  13. python——mysql京东数据库设计案例(源码)
  14. android 之TCP客户端编程
  15. oracle sql 游标的简单用法(tip:sql中两个单引号表示一个单引号)
  16. git命令学习
  17. js将滚动条滚动到指定位置的方法
  18. toFixed()与toPrecision()
  19. linux解压.tar.xz压缩包
  20. vue-cli项目打包出现空白页和路径错误问题

热门文章

  1. echarts标题(title)配置
  2. OpenMP 教程(一) 深入人剖析 OpenMP reduction 子句
  3. perl按照健值排序
  4. 2022-11-07 Acwing每日一题
  5. 大前端html基础学习02
  6. Class文件解析
  7. Django基础笔记5(Session)
  8. 【大数据面试】sqoop:空值、数据一致性、列式存储导出、数据量、数据倾斜
  9. .net6+wpf制作指定局域网ip无法上网的arp欺诈工具
  10. 在Maven中出现javax.mail中文乱码问题解决记录