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