首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从函数执行字符串查询

从函数执行字符串查询
EN

Stack Overflow用户
提问于 2016-08-31 08:19:58
回答 1查看 98关注 0票数 1

我有一个名为rezultz的表,其中一行只包含有效的SQL查询,例如:创建触发器.我试图用一个名为get_all_rezultz()的函数来执行它们,但是它似乎不起作用,为什么呢?

代码语言:javascript
复制
       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();

下面是我遇到的错误:

代码语言:javascript
复制
  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行

代码语言:javascript
复制
    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

*错误*

代码语言:javascript
复制
   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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-31 08:28:22

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

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

代码语言:javascript
复制
RETURN QUERY EXECUTE r.sql_statement;

但是,这仍然不能工作,因为存储在该表中的select语句肯定不会返回一个结果,即如果查询是SETOF rezultz,则返回一个SETOF mytable

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

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

如果您的SQL语句实际上不是您所声称的SELECT语句,那么您将需要使用EXECUTE --您不能对CREATE TRIGGER语句使用RETURN QUERY

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39244294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档