2014-09-05 50 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');