Postgresql
Postgres 函式/過程不會返回值
我是 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 參考