PL / PgSQL动态子查询

时间:2017-02-22 21:13:09

标签: sql postgresql subquery plpgsql

我正在创建一个运行检查的触发器,如果​​它通过则会引发异常。为此,我需要使用动态调用,因为我只将表名作为字符串。我正在使用PostgreSQL,但我无法弄清楚执行命令是如何工作的。当我这样做时:

CREATE OR REPLACE FUNCTION bleep() RETURNS table(id INT) AS $bleep$
  BEGIN
    RETURN QUERY EXECUTE 'SELECT (id) from Applicant';
  END;
$bleep$ LANGUAGE plpgsql;

SELECT * from bleep();

它运作完美,我从申请人那里找回了一张id的表格。但是当我这样做时:

CREATE OR REPLACE FUNCTION bleep() RETURNS BOOLEAN AS $bleep$
  BEGIN
    IF (EXISTS (EXECUTE 'SELECT (id) from Applicant')) THEN
      RETURN TRUE;
    ELSE
      RETURN FALSE;
    END IF;
  END;
$bleep$ LANGUAGE plpgsql;

它告诉我:

  

错误:语法错误处于或接近“EXECUTE”位置:87

这只是一个玩具示例,我想弄清楚它是如何工作的,我已经阅读了很多文档和指南。如果我能弄清楚这个玩具示例,我可以完全触发工作,因为我尝试使用硬编码表名。我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:2)

CREATE OR REPLACE FUNCTION bleep() RETURNS BOOLEAN AS $bleep$
  DECLARE
        res bool;
  BEGIN
    EXECUTE 'SELECT exists (select 1 from Applicant)' INTO res;
    return res;
  END;
$bleep$ LANGUAGE plpgsql;

答案 1 :(得分:0)

CREATE OR REPLACE FUNCTION bleep() RETURNS BOOLEAN AS $bleep$
  BEGIN
    return query EXECUTE 'SELECT exists (select 1 from Applicant)';
  END;
$bleep$ LANGUAGE plpgsql;

答案 2 :(得分:0)

我误解了你的问题。 这个怎么样?

CREATE FUNCTION bleep(integer) RETURNS boolean
    AS 'select case when count(*) = 0 then false else true end from Applicant where id = $1;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;

您可以通过SQLFiddle测试:http://sqlfiddle.com/#!15/33954/1

相关问题