web-dev-qa-db-ja.com

PL / pgSQLの実行と実行

PL/pgSQLでの実行と実行の違いは何ですか?

マニュアルから:

たとえば、副作用はあるが有用な結果値を持たない関数を呼び出す場合など、式またはSELECTクエリを評価して結果を破棄することが役立つ場合があります。 PL/pgSQLでこれを行うには、PERFORMステートメントを使用します。

しかし、私が次のようなことをしようとしているとき:

perform 'create table foo as (select 1)';

何も起こりません。ただし、このクエリには副作用(テーブルの作成)があり、結果は破棄される可能性があります。

私は1つのことを正しく考えていると思います:私が使用できる機能を実行するために:

perform pg_temp.addInheritance(foo);
13
Guy s

PERFORMは、void関数の呼び出しに使用されるplpgsqlコマンドです。 PLpgSQLは無用のSELECTステートメントに注意します-SELECT句のないINTO句は許可されません。ただし、関数を呼び出す必要があり、結果を保存する必要がない場合があります(または関数に結果がありません)。 SQLの関数は、SELECTステートメントで呼び出されます。しかし、PLpgSQLでは不可能です。そのため、コマンドPERFORMが導入されました。

_CREATE OR REPLACE FUNCTION foo()
RETURNS void AS $$
BEGIN
  RAISE NOTICE 'Hello from void function';
END;
$$ LANGUAGE plpgsql;

-- direct call from SQL
SELECT foo();

-- in PLpgSQL
DO $$
BEGIN
  SELECT foo(); -- is not allowed
  PERFORM foo(); -- is ok
END;
$$;
_

PERFORMステートメントはパラメーターを実行し、結果を忘れました。

あなたの例perform 'create table foo as (select 1)';

SELECT 'create table foo as (select 1)'と同じです。文字列「create table foo as(select 1)」を返し、この文字列は破棄されます。

EXECUTEステートメントは、式を評価して文字列を取得します。次のステップで、この文字列が実行されます。

EXECUTE 'create table ' || some_var || '(a int)';には2つのステップがあります

  1. 'create table ' || some_var || '(a int)'を評価します
  2. たとえば_some_var_がmytabの場合、コマンドcreate table mytab(a int)を実行します

PERFORMステートメントは、関数が割り当てステートメントで使用されていない場合、関数呼び出しに使用されます。 EXECUTEは、動的SQLの評価に使用されます-実行時にSQLコマンドの形式がわかっている場合。

19
Pavel Stehule

引用するドキュメント のさらに次の行:

これはクエリを実行し、結果を破棄します。 SQL SELECTコマンドを記述するのと同じ方法でクエリを記述しますが、最初のキーワードSELECTをPERFORMに置き換えます。

重点鉱山

executeは動的クエリを実行します(上記と同じドキュメント)

5
Vao Tsun