PL/PgSQL 动态子查询
PL/PgSQL Dynamic Subqueries
我正在创建一个运行检查的触发器,如果检查通过则引发异常。为此,我需要使用动态调用,因为我只有 table 名称作为字符串。我正在使用 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();
它工作得很好,我从申请人那里取回了 table 个 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;
它告诉我:
ERROR: syntax error at or near "EXECUTE" Position: 87
这只是我为了弄清楚它是如何工作而制作的一个玩具示例,我已经阅读了很多文档和指南。如果我能弄清楚这个玩具示例,我就可以使完整的触发器工作,因为我尝试过对 table 名称进行硬编码。我怎样才能使这项工作?
CREATE OR REPLACE FUNCTION bleep() RETURNS BOOLEAN AS $bleep$
BEGIN
return query EXECUTE 'SELECT exists (select 1 from Applicant)';
END;
$bleep$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION bleep() RETURNS
BOOLEAN AS $bleep$
BEGIN
IF (EXISTS (SELECT id from Applicant)) THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END;
$bleep$ LANGUAGE plpgsql;
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;
我误解了你的问题。
这个怎么样?
CREATE FUNCTION bleep(integer) RETURNS boolean
AS 'select case when count(*) = 0 then false else true end from Applicant where id = ;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
你可以通过SQLFiddle测试:http://sqlfiddle.com/#!15/33954/1
我正在创建一个运行检查的触发器,如果检查通过则引发异常。为此,我需要使用动态调用,因为我只有 table 名称作为字符串。我正在使用 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();
它工作得很好,我从申请人那里取回了 table 个 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;
它告诉我:
ERROR: syntax error at or near "EXECUTE" Position: 87
这只是我为了弄清楚它是如何工作而制作的一个玩具示例,我已经阅读了很多文档和指南。如果我能弄清楚这个玩具示例,我就可以使完整的触发器工作,因为我尝试过对 table 名称进行硬编码。我怎样才能使这项工作?
CREATE OR REPLACE FUNCTION bleep() RETURNS BOOLEAN AS $bleep$
BEGIN
return query EXECUTE 'SELECT exists (select 1 from Applicant)';
END;
$bleep$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION bleep() RETURNS
BOOLEAN AS $bleep$
BEGIN
IF (EXISTS (SELECT id from Applicant)) THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END;
$bleep$ LANGUAGE plpgsql;
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;
我误解了你的问题。 这个怎么样?
CREATE FUNCTION bleep(integer) RETURNS boolean
AS 'select case when count(*) = 0 then false else true end from Applicant where id = ;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
你可以通过SQLFiddle测试:http://sqlfiddle.com/#!15/33954/1