web-dev-qa-db-ja.com

関数を作成せずにpl / pgsqlコードを実行するにはどうすればよいですか?

SQL Serverを使用すると、SQL Server Management Studioまたはその他のクライアントを介して、完全な手続き型ロジックを使用してアドホックT-SQLコードを実行できます。私はPostgreSQLでの作業を始めており、PGSQLでは関数にロジックを埋め込む必要があるという点で少し違いがあります。

関数の実行を作成せずにPL/PGSQLコードを実行する方法はありますか?

49

Postgres 9

DO $$ 
-- declare
BEGIN
  /* pl/pgsql here */
END $$;
60
chotchki

いいえ、まだです。バージョン9.0(まだアルファ版)にはこのオプション(do)があり、リリースされるまで待つ必要があります。

6
Frank Heikens

セミコロンを正確に正しい場所に追加することはかなり厳しいので、私はこれを機能させるのに苦労しました。しかし、慣れるとうまくいきます。もちろん、レコードを返すことができないことに加えて、通知と例外を発生させ、一時テーブルを使用するなどのその他の回避策を実行できます(@ErwinBrandstetterが上記のコメントで指摘したとおり)。

例えば。:

DO 
$$
BEGIN
  IF EXISTS(SELECT 'any rows?' 
              FROM {your_table} 
              WHERE {your_column} = 'blah')
  THEN
      RAISE NOTICE 'record exists';
  ELSE
      RAISE EXCEPTION 'record does not exist';
  END IF;

  DROP TABLE IF EXISTS foo;

  CREATE TEMP TABLE foo AS
  SELECT 'bar'::character varying(5) as baz;
END 
$$;

SELECT * FROM foo;
1
Davos