从函数执行字符串查询

Executing string queries from function

我有一个名为 rezultz 的 table,其中 1 行仅包含有效的 SQL 查询,例如:CREATE TRIGGER ...我正在尝试使用名为 get_all_rezultz 的函数执行它们() 但它似乎不起作用,知道为什么吗?

       CREATE OR REPLACE FUNCTION get_all_rezultz() RETURNS SETOF rezultz AS
    $BODY$
  DECLARE
r rezultz%rowtype;
   BEGIN
FOR r IN
    SELECT * FROM rezultz 
LOOP
    -- can do some processing here
    RETURN QUERY EXECUTE r; -- return current row of SELECT
END LOOP;
RETURN;
 END
  $BODY$
 LANGUAGE plpgsql;

  SELECT * FROM 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(); ")"

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

    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

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

   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

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

所以需要在execute语句中使用列名。假设 table 中的列称为 sql_statement 您需要使用:

RETURN QUERY EXECUTE r.sql_statement;

但是,这仍然不起作用,因为存储在 table 中的 select 语句绝对不会 return 结果是 SETOF rezultz 它 returns a SETOF mytable 如果查询是 select * from mytable.

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

即使这样也行不通,因为一个函数仍然只有 return 一个结果,而不是来自多个查询的多个结果 - 如果 rezultz 包含多于一行,就会发生这种情况。

如果您的 SQL 陈述实际上不是您声称的 SELECT 陈述,您将需要使用 EXECUTE 您不能使用 RETURN QUERY CREATE TRIGGER声明。