Postgresql
如何創建一個返回值的postgres函式
我正在嘗試將我的一些網路應用程序邏輯移動到 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