1

plpgsqlのIF条件内でSQL文を実行するには? 関数を作成したり置き換えたりしたくありません。これは私が試したものです:

DO LANGUAGE plpgsql $$
BEGIN
IF 'Khosla' = 'Khosla' THEN
SELECT * FROM test_log limit 10;
ELSE
RAISE NOTICE 'not worked';
END IF;
END;
$$;

ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function "inline_code_block" line 3 at SQL statement

これも試しましたが、データを取得できませんでした:

DO LANGUAGE plpgsql $$
BEGIN
if 'a' = 'a' THEN
PERFORM * FROM test_log limit 10;
else
raise notice 'not worked';
end if;
end;
$$;

Output: Query returned successfully with no result in 13 ms.

ドキュメントを適切に読んだ後、PERFORM が SQL を実行し、結果セットを破棄することを知りました。

SQL ステートメントを実行して結果セットを取得するのを手伝ってもらえますか?

4

2 に答える 2

1

ステートメントから値を返すことはできません。DO代わりに plpgsql 関数を作成してください。

RETURNING句またはOUTパラメーターを使用して戻り値の型を定義するには、いくつかの方法があります。についてのマニュアルを読んでくださいCREATE FUNCTION

関数から値を返す方法はいくつかあります。マニュアルの「関数から戻る」の章を読んでください。

特に、テーブルから行全体を返そうとしているので、関数宣言にテーブルの登録済みの型を使用できます。

CREATE FUNCTION foo ()
  RETURNING SETOF test_log 
$func$
BEGIN

IF 'a' = 'a' THEN
  RETURN QUERY
  SELECT * FROM test_log LIMIT 10;
ELSE
   RAISE WARNING $$Didn't work!$$;
END IF;

END
$func$ LANGUAGE plpgsql;

電話:

SELECT * FROM foo ();

または、ここで SO を検索してみてください。関連するコード例を多数投稿しました。

DOステートメントの回避策

関数を使用できない場合、DO ステートメントを使用した中途半端な唯一の回避策は、一時テーブルを使用することです。

CREATE TEMP TABLE tbl_tmp AS
SELECT * FROM test_log LIMIT 0;

$do$
BEGIN

IF 'a' = 'a' THEN
  INSERT INTO tbl_tmp
  SELECT * FROM test_log LIMIT 10;
ELSE
   RAISE WARNING $$Didn't work!$$;
END IF;

END
$do$ LANGUAGE plpgsql;

SELECT * FROM tbl_tmp;

一時テーブルは、セッションの終了時に自動的に削除されます。

于 2013-10-01T19:58:00.080 に答える