2017-02-22 1 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

私はこれを試してみました: 'ERROR:SETOF以外の関数でRETURN QUERYを使うことはできませんPosition: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

私はあなたの質問を誤解。 これはいかがですか?あなたはSQLFiddleでテストすることができます

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; 

http://sqlfiddle.com/#!15/33954/1