首页 > 其他分享 > 一文详解数仓GaussDB(DWS) 函数出参带出方式

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

时间:2023-02-10 17:36:35浏览次数:51  
标签:function 数仓 参带 函数 DWS int inner public

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


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

标签:function,数仓,参带,函数,DWS,int,inner,public
From: https://blog.51cto.com/u_15214399/6049629

相关文章

  • 数仓
    http://t.csdn.cn/NazpW  离线数仓-伪分布虚拟机(所有组件部署完成,全流程运行成功)(数仓4.0-2.0,CDH)所有组件部署好的镜像下载(在下面),仅供参考学习。(百度网盘,微云下载…)博......
  • 一文详解数仓GaussDB(DWS) 函数出参带出方式
    摘要:本文主要讲解DWS函数出参带出方式。本文分享自华为云社区《GaussDB(DWS)功能--函数出参#【玩转PB级数仓GaussDB(DWS)】》,作者:譡里个檔。DWS的PL/pgSQL函数/存储......
  • GaussDB(DWS)现网案例:collation报错
    摘要:用户创建hash分布表,使用pbe方式执行使用分布列作为查询条件的语句时报错本文分享自华为云社区《GaussDB(DWS)现网案例之collation报错》,作者:你是猴子请来的救兵吗。......
  • Dataworks数仓建设基础
    1数仓基本概念1.1数据仓库架构源数据, 数据仓库, 数据应用,具体架构如下:源数据:该部分数据主要是从生产数据库,线下手工数据和日志数据,集成到dataworks中,形成了数仓的第一......
  • 优化数仓业务视图:过滤条件传递
    摘要:在业务功能实现时,经常会用到视图简化查询SQL。但有时候会因为视图降低查询效率,本文主要分析在业务需求满足的情况下,将有效的过滤条件传递到基表,减少运算过程中数据库需......
  • 火山引擎ByteHouse助力中国地震台网中心,快速构建一站式实时数仓
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群近日,中国地震台网中心与火山引擎达成合作,双方将围绕ByteHouse实时数仓展开合作。中国地震台......
  • 火山引擎ByteHouse助力中国地震台网中心,快速构建一站式实时数仓
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群近日,中国地震台网中心与火山引擎达成合作,双方将围绕ByteHouse实时数仓展开合作。中国地......
  • 文盘Rust -- rust 连接云上数仓 starwift
    作者:京东云贾世闻最近想看看rust如何集成clickhouse,又犯了好吃懒做的心理(不想自己建环境),刚好京东云发布了兼容ck的云原生数仓Starwfit,于是搞了个实例折腾一番。Sta......
  • 数仓建设保姆级5W字教程,离线实时一网打尽(理论+实战)
     文档大纲  一、数仓基本概念 1、数据仓库架构 我们在谈数仓之前,为了让大家有直观的认识,先来谈数仓架构,“架构”是什......
  • 数仓建设保姆级5W字教程,离线实时一网打尽(理论+实战)
     文档大纲  一、数仓基本概念 1、数据仓库架构 我们在谈数仓之前,为了让大家有直观的认识,先来谈数仓架构,“架构”是什......