この構成は不可能です:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...
次のように簡略化できます:
IF EXISTS (SELECT 1 FROM mytable) THEN ...
しかし、あなたの例はおそらく単純化されています。 動的SQLの場合 EXECUTE
で実行 、こちらのマニュアルをお読みください。特殊変数FOUND
を確認できます DMLコマンドを実行した直後に、ここの行が影響を受けているかどうかを確認します:
IF FOUND THEN ...
ただし:
特に
EXECUTE
に注意してくださいGET DIAGNOSTICS
の出力を変更します 、ただし、FOUND
は変更されません 。
大胆な強調鉱山。プレーンなEXECUTE
の場合 代わりにこれを行ってください:
...
DECLARE
i int;
BEGIN
EXECUTE 'SELECT 1 FROM mytable'; -- something dynamic here
GET DIAGNOSTICS i = ROW_COUNT;
IF i > 0 THEN ...
または 適切な場合(特に単一行の結果のみの場合)は、 INTO
を使用します EXECUTE
を含む句 動的クエリから直接結果を取得します。ここでマニュアルを引用します:
行または変数のリストを指定する場合は、クエリの結果の構造と完全に一致する必要があります(レコード変数を使用すると、結果の構造と自動的に一致するように構成されます)。複数の行が返された場合、最初の行のみが
INTO
に割り当てられます。 変数。行が返されない場合、NULLがINTO
に割り当てられます 変数。
...
DECLARE
_var1 int; -- init value is NULL unless instructed otherwise
BEGIN
EXECUTE format('SELECT var1 FROM %I WHERE x=y LIMIT 1', 'my_Table')
INTO _var1;
IF _var1 IS NOT NULL THEN ...