从函数执行字符串查询

时间:2016-08-31 08:19:58

标签: postgresql plpgsql dynamic-sql

我有一个名为rezultz的表,其中1行只包含有效的SQL查询,例如:CREATE TRIGGER ...我试图用这个名为get_all_rezultz()的函数执行它们但它似乎不起作用,任何想法为什么?

  NOTICE:  identifier "CREATE TRIGGER userman_if_modified_trg AFTER    INSERT OR UPDATE OR DELETE ON userman FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); " will be truncated to "CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPDATE O"
   CONTEXT:  SQL statement "("CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPDATE OR DELETE ON userman FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); ")"

这是我得到的错误:

    ERROR:  syntax error at or near ""CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPDATE OR DELETE ON userman FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); ""
    LINE 1: ("CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPD...
     ^
  QUERY:  ("CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPDATE OR DELETE ON userman FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); ")
      CONTEXT:  PL/pgSQL function get_all_rezultz() line 10 at RETURN QUERY

PL / pgSQL函数get_all_rezultz()在RETURN QUERY的第10行

   ERROR: syntax error at or near ""CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPDATE OR DELETE ON userman          FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); ""
    SQL state: 42601
     Context: PL/pgSQL function get_all_rezultz() line 10 at RETURN QUERY

**********错误**********

{{1}}

1 个答案:

答案 0 :(得分:1)

变量r是包含多个列的记录。它不是标量值(例如字符串)。

因此,您需要在execute语句中使用列名。假设表中的列名为sql_statement,则需要使用:

RETURN QUERY EXECUTE r.sql_statement;

但是,这仍然无效,因为存储在该表中的select语句绝对不会返回SETOF rezultz的结果,如果查询为SETOF mytable,则返回select * from mytable

您需要指定RETURNS SETOF record,但是当调用函数时,您需要指定结果的列名和结构。

即使这样,这也不会起作用,因为函数仍然只返回一个结果,而不是多个查询的多个结果 - 如果rezultz包含多行,则会发生这种情况。

如果您的SQL语句不是您声明的SELECT个语句,则需要使用EXECUTE RETURN QUERYCREATE TRIGGER /etc/vimrc 1}}陈述。

相关问题