2014-09-05 65 views
2

我想要一個相當通用的函數,它需要INSERT,UPDATEDELETE,它可能包含一個RETURNING子句,並返回該結果。一個相當人爲的例子可能是這樣的:如何從plpgsql函數返回RETURNING子句的結果?

CREATE FUNCTION my_insert(sql_insert TEXT) RETURNS record AS $$ 
DECLARE 
    result record; 
BEGIN 
    EXECUTE sql_insert INTO result; 
    RETURN result; 
END; 
$$ LANGUAGE plpgsql; 

SELECT my_insert('INSERT INTO foo VALUES (1) RETURNING some_column, another_column'); 

雖然這個工程確定,我不認爲record是正確的類型在這裏,因爲RETURNING通常會返回一個表型。我想從RETURNING的函數中返回完全相同的格式,但我不知道如何。

+0

「RETURNING INTO」表單在這裏工作嗎? – JimB 2014-09-05 16:18:54

+0

你考慮過'SETOF RECORD'嗎? – Wolph 2014-09-05 16:18:59

+2

函數沒有多態返回。相關:[PostgreSQL:如何在不使用「列定義列表」的情況下從表中返回動態行?](http://stackoverflow.com/questions/22861143) – 2014-09-05 16:23:29

回答

3

返回record是細的,只要從該函數的SELECT定義表結構:

SELECT * FROM my_insert('INSERT INTO foo VALUES (1) RETURNING some_column, another_column) 
    AS f(some_column bigint, another_column timestamp); 

如果來自my_insert函數的返回值總是將是一個特定類型的,複合型也許是一個更好的方式去:

CREATE TYPE my_insert_result AS (
    some_column bigint, 
    another_column timestamp 
); 

,然後更改函數返回類型:

CREATE FUNCTION my_insert(sql_insert TEXT) RETURNS my_insert_result AS $$ 
DECLARE 
    result my_insert_result; 
BEGIN 
    EXECUTE sql_insert INTO result; 
    RETURN result; 
END; 
$$ LANGUAGE plpgsql; 

SELECT * FROM my_insert('INSERT INTO foo VALUES (1) RETURNING some_column, another_column');