Postgresql

如何創建一個返回值的postgres函式

  • July 1, 2021

我正在嘗試將我的一些網路應用程序邏輯移動到 postgres 函式中。但是我在創建一個非常基本的插入函式時遇到了一些錯誤。

這是我要創建的功能;

CREATE OR REPLACE FUNCTION create_user(IN email EMAIL, password TEXT, thumb TEXT)
RETURNS text AS 
$BODY$
BEGIN
  insert into users (unqid, thumb, email, password) 
  values (gen_random_uuid(), thumb, email, password)
  returning unqid ;
END;
$BODY$
 LANGUAGE plpgsql
 VOLATILE

如果插入成功,我試圖讓函式返回項目的 uuid。我這樣稱呼它;

select * from create_user('newuser@mail.com', 'passpopcorn', 'thumbelinaurl');

收到此錯誤;

SQL Error [42601]: ERROR: query has no destination for result data
 Where: PL/pgSQL function create_user(email,text,text) line 3 at SQL statement

從我的Google搜尋看來,當您在查詢中沒有返回語句時,就會出現此錯誤。但在我的插入查詢中,我確實有一個返回語句。

額外的問題;對於簡單的插入語句(比如這裡的這個,或者一個有幾個選擇後跟一個插入的語句),函式是更好的選擇還是程序?

SQL 錯誤

$$ 42601 $$: 錯誤: 查詢沒有結果數據的目的地

insert ... returning ...生成一個包含returning子句中引用的列的結果集。在 PL/pgSQL 塊中,必須以某種方式處理結果集。你有三個選擇:

  • 中間變數
 CREATE OR REPLACE FUNCTION create_user(IN email EMAIL, password TEXT, thumb TEXT)
 RETURNS VARCHAR(40) AS 
 $BODY$
 DECLARE id VARCHAR(40);
 BEGIN
    insert into users (unqid, thumb, email, password) 
    values (gen_random_uuid(), thumb, email, password)
    returning unqid INTO id;
    RETURN id;
 END;
 $BODY$
   LANGUAGE plpgsql
   VOLATILE  
  • return query,這避免了額外的變數
 CREATE OR REPLACE FUNCTION create_user(IN email EMAIL, password TEXT, thumb TEXT)
 RETURNS TABLE (id VARCHAR(40)) AS 
 $BODY$
 BEGIN
    RETURN QUERY 
    insert into users (unqid, thumb, email, password) 
    values (gen_random_uuid(), thumb, email, password)
    returning unqid;
 END;
 $BODY$
   LANGUAGE plpgsql
   VOLATILE  
  • 一個簡單的 SQL 函式,在你的情況下我更喜歡它,因為你不需要任何 PL/pgSQL 功能
 CREATE OR REPLACE FUNCTION create_user(IN email EMAIL, password TEXT, thumb TEXT)
 RETURNS TABLE (id VARCHAR(40)) AS 
 $BODY$
    insert into users (unqid, thumb, email, password) 
    values (gen_random_uuid(), thumb, email, password)
    returning unqid;
 $BODY$
   LANGUAGE SQL

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