浅谈DWS函数出参方式
摘要:DWS的PL/pgSQL函数/存储过程中有一个特殊的语法PERFORM语法,用于执行语句但是丢弃执行结果的场景,常用于一些状态判断的场景。
本文分享自华为云社区《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 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$ ;

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
SFC 点名批评农具制造商 John Deere 违反 GPL 协议
软件自由保护协会 (SFC)公开批评,并呼吁世界最大的农业设备制造商 John Deere (美国迪尔公司)按照 GPL 开源许可证的规定交出源代码。 在周四发表的一篇博文中,SFC 合规总监 Denver Gingerich 指出这些农具制造商利用 GPL 软件盈利,比如一些带软件的农具(拖拉机、联合收割机等),因为这些农具的制造商使用了 GPL 协议的软件,但并未履行 GPL 的义务将农具的软件代码开源,农民已被剥夺了修理工具的权力。 GPL 开源许可证具有很强的传染性,它规定了若一个项目使用了带 GPL 许可的代码,则该项目也必须共享源代码。 博文特别点名批评了 John Deere公司,称其为“特别恶劣的违规者”。Deere 的农业机器中部署最广泛的 GPL 软件是 Linux。 与大多数 Linux 发行版一样,Deere 机器内的 Linux 版本也使用 copyleft 许可下的几个程序,但其从未公开任何源代码。这导致农具出现软件层面的损坏时,农民无法自行修理,只能继续求助于农具制造商,或者购买新产品。 Gingerich 称,多年来 SFC 一直试图与 John Dee...
- 下一篇
Ascend CL两种数据预处理的方式:AIPP和DVPP
摘要:本文介绍了昇腾CANN提供的两种数据预处理的方式:DVPP和AIPP,介绍了两者的功能、差别及联系,并以具体代码示例介绍了如何使用DVPP和AIPP的功能。 本文分享自华为云社区《了解AscendCL数据预处理的两种方式:AIPP和DVPP》,作者:昇腾CANN。 数据预处理的典型使用场景 受网络结构和训练方式等因素的影响,绝大多数神经网络模型对输入数据都有格式上的限制。在计算机视觉领域,这个限制大多体现在图像的尺寸、色域、归一化参数等。如果源图或视频的尺寸、格式等与网络模型的要求不一致时,我们需要对其处理,使其符合模型的要求,这个操作,一般称之为数据预处理。 AIPP、DVPP,它们都能做什么 CANN提供了两套专门用于数据预处理的方式:AIPP和DVPP。 总结一下,虽然都是数据预处理,但AIPP与DVPP的功能范围不同(比如DVPP可以做图像编解码、视频编解码,AIPP可以做归一化配置),处理数据的计算单元也不同,AIPP用的AI Core计算加速单元,DVPP就是用的专门的图像处理单元。 AIPP、DVPP可以分开独立使用,也可以组合使用。组合使用场景下,一般先使用DVP...
相关文章
文章评论
共有0条评论来说两句吧...