首页 > 其他分享 >浅谈DWS函数出参方式

浅谈DWS函数出参方式

时间:2023-03-17 15:22:37浏览次数:45  
标签:function DWS 浅谈 int 出参 inner public 函数

摘要: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$
;

 

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

标签:function,DWS,浅谈,int,出参,inner,public,函数
From: https://www.cnblogs.com/huaweiyun/p/17226928.html

相关文章

  • 8年测试工程师,3年功能,5年自动化,浅谈我的自动化测试进阶之路...
     前言大家好我是小濠,本命马玉濠,已近从事测试行业8年了,自己也从事过3年的手工测试,从事期间越来越觉得如果一直在手工测试的道路上前进,并不会有很大的发展,所以通......
  • 浅谈Linux下的shell--BASH
    shell的概念与作用我们已经学习并知道了操作系统实际上就是一款软件,一款用来管理计算机软硬件资源,为用户提供良好的执行环境的软件。假如该软件能被用户随意操作,就会有可能......
  • 浅谈容量测试与容量规划
    转载:https://www.cnblogs.com/imyalost/p/9630846.html在性能测试中,需要根据具体的性能需求和系统架构等情况,采用不同的测试策略,其中最常见的策略就有容量测试。这篇博客......
  • 浅谈基准测试
    转载:https://www.cnblogs.com/imyalost/p/9630843.html之前的博客介绍过关于性能测试类型的内容,在性能测试中有一种测试类型叫做基准测试。这篇博客,就聊聊关于基准测试的......
  • 珠海MES厂商浅谈实施MES系统的重要因素~
    执行好MES系统,是生产制造企业成功应用MES系统的前提,同时也是生产制造企业实现数字化、智能化工厂车间建设的的第一步,对于制造企业的未来的发展至关重要,那么如何执行好MES系......
  • [GO语言tips05]浅谈GORM常用方法
    0.引言GORM就是通过Go语言直接使用封装好的SQL语句,在使用的时候很多方法,那到底这些东西是如何执行的。主要说一下常见的几个CRUD方法。1.连接数据库使用的是gorm.Open......
  • 浅谈泰勒展开
    什么是导数对于一个一次函数\(\mathrm{f(x)=kx+b}\)来说,我们发现\(\mathrm{x}\)每增加一个单位长度,\(\mathrm{f(x)}\)都会相应的增加\(\mathrm{k}\)个单位长度......
  • 浅谈Vue3与Vue2区别
    1.Vue2选用选项式API(optionsapi)对比Vue3组合式API(CompositionApi)optionsapi在代码里分割了不同的属性(properties):data,computed属性,methods,选项所定义的属性都会暴露......
  • 浅谈 Axios 和 Fetch 的区别
    1.简单区分   2.请求方式axios传一个对象,里面包含请求url和请求方法,参数。fetch传两个参数,第一个是请求url,第二个是请求的一些参数。//axios请求:constoptio......
  • 亚马逊RedShift调研-浅谈技术框架、优缺点及网上风评
    RedShift是亚马逊开发的一个站式云上数据仓库服务。网上案例与风评较少,做的一些个人总结。1.RedShift优势及特色1.1官方介绍①借助AmazonRedshift的数据仓库......