表作为PostgreSQL函数的参数

时间:2016-03-18 16:16:37

标签: sql postgresql function

我试图将一个表作为PostgreSQL函数中的参数传递,并且我无法在第一个中找到正确的关键字(我的代码中应该代替table) line:

CREATE FUNCTION test.fcttest(table)   
RETURNS SETOF test.out_table
AS $$
    INSERT INTO test.out_table /* obviously, the schema for this table is what it should be, an int column for A.id and a varchar(30) column for A.another_field */
        SELECT A.id, A.another_field
        FROM $1 A;
    SELECT A.id, A.another_field 
        FROM $1 A;
$$ 
LANGUAGE SQL;

或者也许它不能像这样工作?如果是这样,我该怎么做?

(另外,我想我的功能也可能存在与SQL注入相关的问题,但请暂时忽略它们,它是在安全环境中的原型,所以我不必担心目前它。或者如果你确实解决了这个问题,请在答案的另一部分中这样做,这样我就能理解是什么表达了:))。

感谢。

1 个答案:

答案 0 :(得分:1)

您不能传递一个表作为参数,只传递表的名称:

CREATE FUNCTION test.fcttest(tbl text) RETURNS SETOF test.out_table AS $$
BEGIN
  EXECUTE format('INSERT INTO test.out_table '
                   'SELECT id, another_field FROM %I', tbl);
  RETURN QUERY EXECUTE format('SELECT id, another_field FROM %I', tbl);
END;
$$ LANGUAGE plpgsql;

传递表名时,您需要execute a dynamic command。您只能在plpgsql函数中执行此操作。 format() function%I修饰符的使用可防止SQL注入。使用RETURN NEXT QUERY短语返回行,同样使用动态命令。

请注意,此逻辑 会将一组记录插入到表test.out_table中,然后返回相同的记录集。不确定这是否是你真正想要的。