淺談DWS函數出參方式

来源:https://www.cnblogs.com/huaweiyun/archive/2023/03/17/17226928.html
-Advertisement-
Play Games

摘要:DWS的PL/pgSQL函數/存儲過程中有一個特殊的語法PERFORM語法,用於執行語句但是丟棄執行結果的場景,常用於一些狀態判斷的場景。 本文分享自華為雲社區《GassDB(DWS)功能 -- 函數出參 #【玩轉PB級數倉GaussDB(DWS)】》,作者:譡里個檔。 DWS的PL/pgSQ ...


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

 

點擊關註,第一時間瞭解華為雲新鮮技術~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在嵌入式軟體開發過程中,花在測試和花在編碼的時間比通常在3:1左右(實際上可能更多)。這個比例會隨著工程師編程、測試水平的提高而不斷下降,但無論如何,軟體測試都是嵌入式軟體開發中至關重要的部分。 多年前,一位工程師為了對嵌入式擁有更深層次理解的追求,曾發出這樣的疑問:“我怎麼才能知道並懂得我的系統到 ...
  • 1.導入 Elasticsearch GPG KEY: rpm --import ./GPG-KEY-elasticsearch or apt-key add ./GPG-KEY-elasticsearch 2.添加elasticsearch的yum repo文件 vim /etc/yum.repo ...
  • ​ 第一步、下載壓縮包 下載社區版的 MySQL,根據需求下載對應版本,其中有最小安裝版本。具體各個版本的區別,可以上網查詢,鏈接 MySQL :: Download MySQL Community Server 第二步,解壓壓縮包,並複製到安裝目錄 進入到壓縮包所在的文件夾,解壓分為兩次,第一次解 ...
  • 使用 NMCLI 配置靜態乙太網連接 要在命令行上配置乙太網連接,請使用 nmcli 工具。 例如,以下流程使用以下設置為 enp7s0 設備創建 NetworkManager 連接配置文件: 靜態 IPv4 地址 - 192.0.2.1 和 /24 子網掩碼 靜態 IPv6 地址 - 2001:d ...
  • 報錯信息: 在進入系統時,不能正常進入系統,出現了Give root password for maintenance(or type Control-D to continue):的報錯。 報錯原因: 1、在之前寫入的/etc/fstab文件有問題,導致系統在讀取的時候識別不到從而報錯。 解決方法 ...
  • 什麼是消息隊列? 假設你是一個快遞員,你需要將貨物從一個倉庫運到另一個倉庫。但是你發現自己的時間不夠用,需要另外請一個人來幫忙。那麼,你們之間如何進行協作呢? 一種方式是直接將貨物全部交給對方,但這樣存在風險:對方可能會出現問題,導致貨物丟失或損壞。 而另一種更安全的方式是,你將貨物分批發送給對方, ...
  • MySql存儲結構 參考視頻:MySql存儲結構 1.表空間 不同的存儲引擎在磁碟文件上的結構均不一致,這裡以InnoDB為例: CREATE TABLE t(id int(11)) Engine = INNODB; 在新表創建的過程中,InnoDB會在磁碟的data目錄下創建與這個表對應的兩個文件 ...
  • 您可以使用以下 SQL 語句刪除 MS SQL Server 表中重覆的行: WITH CTE AS ( SELECT ROW_NUMBER() OVER(PARTITION BY column1, column2, ... columnN ORDER BY (SELECT 0)) RN FROM ...
一周排行
    -Advertisement-
    Play Games
  • .NET Core 選項系統的主要實現在 Microsoft.Extensions.Options 和 Microsoft.Extensions.Options.ConfigurationExtensions 兩個 Nuget 包。對於一個框架的源碼進行解讀,我們可以從我們常用的框架中的類或方法入手 ...
  • 最近在工作中遇到一個問題,就是我有多個線程會調用bitmap對象,運行的時候報錯,對象當前正在其他地方使用。第一反應肯定是加鎖啊,於是我就在每個用到bitmap的地方都加了鎖,但是運行之後依然報這個錯 測試代碼如下 using System; using System.Drawing; using ...
  • 一:背景 1. 講故事 前段時間有位朋友微信找到我,說他的程式使用 hsl 庫之後,採集 plc 時記憶體溢出,讓我幫忙看一下怎麼回事,哈哈,貌似是分析之旅中的第二次和 hsl 打交道,既然找到我,那就上 windbg 說話吧。 二:WinDbg 分析 1. 為什麼會記憶體溢出 簡單觀察程式的提交記憶體之 ...
  • 在 IIS 上啟用 Websocket 在 Windows Server 2012 或更高版本上啟用對 WebSocket 協議的支持: 備註 使用 IIS Express 時無需執行這些步驟 通過“管理”菜單或“伺服器管理器”中的鏈接使用“添加角色和功能”嚮導。 選擇“基於角色或基於功能的安裝”。 ...
  • C#-垃圾回收機制(GC) 什麼是GC 官網中有這麼一句話: The garbage collector is a common language runtime component that controls the allocation and release of managed memory ...
  • 呆了2個大屏行業的公司,對大屏幕有一些瞭解,所以整理下所瞭解的觸摸屏相關概念。方便自己以及進入這個行業的小伙伴們,能有個系統、快速的認知。 觸摸屏詳細的知識點,網上其實都有。整理資料過程中,我也瞭解了更多的觸摸屏知識,像聲波屏、光學屏之類的之前就沒接觸。下麵分不同的模塊,給大家介紹 交互觸摸屏類型 ...
  • 近段時間忙於各種項目和對【易排平臺】的優化,沒顧得上分享APS相關的小技巧,回頭看看小公眾號的關註人數早已達1500+,在此爭取時間寫一下這段時間在項目上及平臺優化過程中遇到的一些小技巧,以感謝諸位的關註。過去數月的解決的問題中,涉及最多的是規劃模型中,實現各種時間維度的功能,目前在平臺上也稍有成果 ...
  • 針對大量log日誌快速定位錯誤地方 動態查看日誌 tail -f catalina.ou 從頭打開日誌文件 cat catalina.ou 可以使用 >nanjiangtest.txt 輸出某個新日誌去查看 [[email protected] logs]# cat -n catalina.out |grep 7 ...
  • 前言 RocketMQ是阿裡巴巴旗下一款開源的MQ框架,經歷過雙十一考驗、Java編程語言實現,有非常好完整生態系統。RocketMQ作為一款純java、分散式、隊列模型的開源消息中間件,支持事務消息、順序消息、批量消息、定時消息、消息回溯等 本篇文章第一部分屬於一些核心概念和工作流程的講解;第二部 ...
  • 在java,c#類的成員修飾符包括,公有、私有、程式集可用的、受保護的。 對於python來說,只有兩個成員修飾符:公有成員,私有成員 成員修飾符是來修飾誰呢?當然是修飾成員了。那麼python類的成員包括什麼呢? python成員: 欄位,方法,屬性 每個類成員的修飾符有兩種: 公有成員:內部外部 ...