PL/pgSQLでの実行と実行の違いは何ですか?
マニュアルから:
たとえば、副作用はあるが有用な結果値を持たない関数を呼び出す場合など、式またはSELECTクエリを評価して結果を破棄することが役立つ場合があります。 PL/pgSQLでこれを行うには、PERFORMステートメントを使用します。
しかし、私が次のようなことをしようとしているとき:
perform 'create table foo as (select 1)';
何も起こりません。ただし、このクエリには副作用(テーブルの作成)があり、結果は破棄される可能性があります。
私は1つのことを正しく考えていると思います:私が使用できる機能を実行するために:
perform pg_temp.addInheritance(foo);
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つのステップがあります
'create table ' || some_var || '(a int)'
を評価しますsome_var
_がmytabの場合、コマンドcreate table mytab(a int)
を実行しますPERFORM
ステートメントは、関数が割り当てステートメントで使用されていない場合、関数呼び出しに使用されます。 EXECUTE
は、動的SQLの評価に使用されます-実行時にSQLコマンドの形式がわかっている場合。
引用するドキュメント のさらに次の行:
これはクエリを実行し、結果を破棄します。 SQL SELECTコマンドを記述するのと同じ方法でクエリを記述しますが、最初のキーワードSELECTをPERFORMに置き換えます。
重点鉱山
execute
は動的クエリを実行します(上記と同じドキュメント)