如何从plpgsql函数返回RETURNING子句的结果?

时间:2014-09-05 16:07:07

标签: postgresql plpgsql

我希望有一个相当通用的函数,它可以包含INSERTUPDATEDELETE,它可能包含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函数返回与我的函数完全相同的格式,但我不确定如何。

1 个答案:

答案 0 :(得分: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');