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

一文,详解,gaussdb,dws,函数,带出,方式 · 浏览次数 : 89

小编点评

**DWS函数出参带出方式** 本文主要介绍DWS函数出参带出方式,包括三种方法: **方法 1:函数出参的方式赋值** ```sql 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:动态查询语句方式赋值** ```sql 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赋值** ```sql 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; ``` **注意:** * 以上三种方法都需要在函数定义中明确指定函数的输入参数和输出参数。 * 函数出参的默认值应与函数定义中的类型一致。 * 使用带出函数出参时,需要确保执行结果不为空。

正文

摘要:本文主要讲解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$
;

 

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

与一文详解数仓GaussDB(DWS) 函数出参带出方式相似的内容:

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

摘要:本文主要讲解DWS函数出参带出方式。 本文分享自华为云社区《GaussDB(DWS)功能 -- 函数出参 #【玩转PB级数仓GaussDB(DWS)】》,作者:譡里个檔 。 DWS的PL/pgSQL函数/存储过程中有一个特殊的语法PERFORM语法,用于执行语句但是丢弃执行结果的场景,常用于一

详解数仓的网络调度与隔离管控能力

摘要:GaussDB目前采用的FIFO调度机制,该调度机制无法满足用户的网络隔离需求和QoS需求,同时FIFO调度可能带来比较严重的抖动。 本文分享自华为云社区《【玩转PB级数仓GaussDB(DWS)】GaussDB(DWS)网络调度与隔离管控能力》,作者:门前一棵葡萄树 。 一、常见的调度算法

详解数仓的向量化执行引擎

本文分享自华为云社区《GaussDB(DWS)向量化执行引擎详解》,作者: yd_212508532。 前言 适用版本:【基线功能】 传统的行执行引擎大多采用一次一元组的执行模式,这样在执行过程中CPU大部分时间并没有用来处理数据,更多的是在遍历执行树,就会导致CPU的有效利用率较低。而在面对OLA

带你走进数仓大集群内幕丨详解关于作业hang及残留问题定位

测试过程中,我们会遇到这样一种情况,我的作业都执行很久了,为啥还不结束,是不是作业hang掉了?

详解共识算法的Raft算法模拟数

摘要:Raft算法是一种分布式共识算法,用于解决分布式系统中的一致性问题。 本文分享自华为云社区《共识算法之Raft算法模拟数》,作者: TiAmoZhang 。 01、Leader选举 存在A、B、C三个成员组成的Raft集群,刚启动时,每个成员都处于Follower状态,其中,成员A心跳超时为1

[转帖]Linux—CPU核数、上下文切换介绍及pidstat等命令详解

https://www.jianshu.com/p/0ae0c1153c34 关注:CodingTechWork,一起学习进步。 引言 并发编程 并发编程的目的是为了改善串行程序执行慢问题,但是,并不是启动更多线程就能够让程序执行更快。因为在并发时,容易受到软硬件资源等限制,从而导致上下文切换慢,频

万字详解,吃透 MongoDB!

本文已经收录进 JavaGuide(「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。) 少部分内容参考了 MongoDB 官方文档的描述,在此说明一下。 MongoDB 基础 MongoDB 是什么? MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数

[转帖]TP50、TP90、TP99、TP999详解

https://www.cnblogs.com/zhangxinglong/p/14324858.html 概念:TP指标: 指在一个时间段内,统计该方法每次调用所消耗的时间,并将这些时间按从小到大的顺序进行排序,并取出结果为:总次数 * 指标数 = 对应TP指标的值, 在取出排序好的时间。 TP5

详解二分查找

二分法详解 大家好,我是Weekoder! 这是我的第一篇文章,如果有做的不好的地方,请见谅,我会尽力改正。 本文中的图片截取于网络视频,非恶意搬运。 二分法,是一个高效的算法,查找一个数的时间复杂度只需要\(O(\log n)\),大大优化了朴素算法(从头到尾地遍历)\(O(n)\)的线性复杂度。

[转帖]Oracle数据库的两种授权收费方式详解

https://www.jb51.net/article/265823.htm 现在Oracle有两种授权收费方式,按CPU(Process)数和按用户数(Named User Plus),前一种方式一般用于用户数不确定或者用户数量很大的情况,典型的如互联网环境,这篇文章主要介绍了Oracle数据库