Postgresql

Postgres 函式/過程不會返回值

  • July 12, 2020

我是 PostgreSQL 的新手,來自 SQL Server,我在創建函式和/或過程時遇到了麻煩。首先,我可以澄清一下,函式和過程之間的唯一區別確實是對事務的支持嗎?

現在回到我的問題,我想要一個簡單的 func/proc 來返回目前連接的使用者。無論如何都不使用它,因此任何其他範例都可以使用,它僅用於學習語法,因為 pgsql 與 t-sql 不同。這是我從教程網站獲取的程式碼:

CREATE OR REPLACE FUNCTION dev.get_user()
RETURNS VARCHAR AS $user$
DECLARE
   $user$ VARCHAR;
BEGIN
   SELECT current_user AS user;
   RETURN user; 
END;
$user$ LANGUAGE plpgsql;

我得到了這個,我不知道為什麼:

ERROR:  syntax error at or near "VARCHAR"
LINE 4:  $user$ VARCHAR;

如果我刪除第 4 行,它會成功創建它,但是當我執行它時,它會返回此錯誤:

ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.

我在 pgsql 12.3 上,如果有什麼不同的話。謝謝你。

我可以澄清一下,函式和過程之間的唯一區別確實是對事務的支持嗎?

不,最大的區別是函式旨在返回某些內容,而過程則不是。

在 PL/pgSQL 中,SELECT 語句的結果需要儲存在某個地方(這就是錯誤消息告訴您的內容)。

變數不是用 a 定義的,$所以第二個$user$以第一個開頭的字元串結束,$user$這就是你得到第一個錯誤的原因。

所以正確的寫法是:

CREATE OR REPLACE FUNCTION dev.get_user()
 RETURNS VARCHAR AS $user$
declare
 l_user varchar
begin
 select current_user
    into l_user;
 return l_user;
end;
$user$
language plpgsql;

SELECT 並不是真正需要的,如果您呼叫一個函式(即current_user),您可以直接分配一個變數:

begin
  l_user := current_user
  return l_user;
end;

分配 using:=比 a 更快SELECT .. INTO


請注意,整個函式可以簡化為:

CREATE OR REPLACE FUNCTION dev.get_user()
 RETURNS VARCHAR 
AS 
$user$
 select current_user;
$user$
language sql;

有關更多詳細資訊,請參閱PL/pgSQL 參考

引用自:https://dba.stackexchange.com/questions/270793