2017-02-22 70 views
1

我正在創建運行檢查的觸發器,如果​​它通過,則會引發異常。爲此,我需要使用動態調用,因爲我只將表名稱作爲字符串。我正在使用PostgreSQL,但我無法弄清楚如何執行命令的作品。當我這樣做:PL/PgSQL動態子查詢

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; 

它告訴我:

ERROR: syntax error at or near "EXECUTE" Position: 87

這僅僅是一個玩具的例子,我提出要弄清楚是如何工作的,我已經閱讀了大量文檔和指南。如果我能弄清楚這個玩具的例子,我可以做出完整的觸發器工作,因爲我試着用硬編碼表名來嘗試。我該如何做這項工作?

+0

無關,但:不要陷入習慣把括號中的列名。雖然'(id)'和'id'是相同的東西,'(a,b)'和'a,b'是非常不同的。 –

+0

你想要測試*完全*。給定表中是否存在名爲'id'的列?或者表中是否有任何行?最好的解決方案取決於這一重要信息。 (和你未申報的Postgres版本。) –

回答

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; 
0
CREATE OR REPLACE FUNCTION bleep() RETURNS BOOLEAN AS $bleep$ 
    BEGIN 
    return query EXECUTE 'SELECT exists (select 1 from Applicant)'; 
    END; 
$bleep$ LANGUAGE plpgsql; 
+0

當我試着這個告訴我:'錯誤:不能在非SETOF函數中使用RETURN QUERY位置:75' – user5505266

0
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; 
+0

雖然這解決了具體例子的問題,但我說我需要使用動態查詢,因爲這是一個需要動態查詢的東西的玩具示例。 – user5505266

+0

@ user5505266你說得對,我回答了另外一個問題,那就是使用動態查詢。 – doctorgu

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