从函数执行字符串查询
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
声明。
我有一个名为 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
声明。