web-dev-qa-db-ja.com

selectではなくexecで関数を呼び出す

関数を呼び出すデフォルトの方法はselect * from my_function()ですか?

何も返さず、テーブルにデータを挿入するだけの関数を作成し、(SQL Serverのバックグラウンドから)_select * from..._で呼び出すのは奇妙に「感じる」からです。

私はexec my_function()のようなものを期待していました

45
Diego

PERFORMステートメントを使用します- http://www.postgresql.org/docs/current/static/plpgsql-statements.html

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

だからそれはただ

DO $$ BEGIN
    PERFORM my_function();
END $$;
46
Roman Pekar

PostgreSQL 11:

PostgreSQL 11 真のストアドプロシージャをサポート @AbdisamadKhalifによって指摘されています。手続き内トランザクション制御をサポートします。

古いバージョン:

はい、それは標準的な方法であり、はい、それは奇妙です。

通常、ストアドプロシージャなどの関数を記述し、CALLまたはEXECUTEコマンドで呼び出します。 PostgreSQLは真のストアドプロシージャ(複数の結果セット、自律型トランザクションなど)をサポートしませんが、sql呼び出し可能なユーザー定義関数のみをサポートします。

そのため、回避策は、FROMを省略したPostgreSQL拡張構文を使用するSELECT function_name()、または(多少)より標準的なSELECT 1 FROM function_name();です。

ODBCドライバー、JDBCドライバーなど)は、{call func_name()}エスケープ構文を理解し、基になるSELECTに自動的に変換します。

37
Craig Ringer

関数がセットを返すときは、fromを使用します。関数がvoidを返したら

select my_function();
22
Clodoaldo Neto