## PostgreSQL編 ストアードプロシージャとは データベースに保存された一連のSQL文や処理のことで、必要に応じて呼び出して実行することができます。 ### メリット ストアードプロシージャは、以下のようなメリットを持ちます。 • **パフォーマンスの向上**: ストアードプロシージャはデータベースにコンパイルされて保存されるため、呼び出すたびにコンパイルする必要がありません。また、ネットワークのトラフィックを減らすこともできます。 • **セキュリティの強化**: ストアードプロシージャはデータベースの権限管理に従って実行されるため、不正なアクセスや操作を防ぐことができます。 • **再利用性と保守性の向上**: ストアードプロシージャは一度作成すれば、複数のアプリケーションやユーザーから呼び出すことができます。また、変更や修正も容易に行うことができます。 ### ストアードプロシージャを作成するための基本構文 PostgreSQLでは、ストアードプロシージャを作成するためにCREATE PROCEDURE文を使います。 CREATE PROCEDURE文の基本的な構文は以下のようになります。 ```SQL= CREATE [OR REPLACE] PROCEDURE procedure_name (parameters) LANGUAGE language_name AS $$ procedure_body $$; ``` • CREATE [OR REPLACE]: ストアードプロシージャを新規作成するか、既存のものを置き換えるかを指定します。 • procedure_name: ストアードプロシージャの名前を指定します。 • parameters: ストアードプロシージャに渡すパラメーターを指定します。パラメーターはIN, OUT, INOUT, VARIADICのいずれかのモードを持ちます。INは入力パラメーター、OUTは出力パラメーター、INOUTは入出力パラメーター、VARIADICは可変長パラメーターを表します。 • LANGUAGE language_name: ストアードプロシージャの言語を指定します。PostgreSQLでは、SQL, PL/pgSQL, PL/Perl, PL/Pythonなどの言語がサポートされています。 • procedure_body: ストアードプロシージャの本体を記述します。本体は$$で囲まれた文字列リテラルとして表現されます。 ### 具体的な作成例 例えば、以下のようなストアードプロシージャを作成してみます。 ```SQL= CREATE OR REPLACE PROCEDURE insert_customer (IN name VARCHAR(50), IN email VARCHAR(50), OUT id INT) LANGUAGE PLpgSQL AS $$ BEGIN INSERT INTO customers (name, email) VALUES (name, email) RETURNING customer_id INTO id; END; $$; ``` このストアードプロシージャは、customersテーブルに新しい顧客情報を挿入し、その顧客IDを返すものです。nameとemailは入力パラメーターで、idは出力パラメーターです。言語はPL/pgSQLを使っています。 ### ストアードプロシージャを呼び出して実行するための基本構文 ストアードプロシージャを作成したら、CALL文で呼び出して実行することができます。CALL文の基本的な構文は以下のようになります。 ```sql= CALL procedure_name (arguments); ``` :::info • procedure_name: 呼び出すストアードプロシージャの名前を指定します。 • arguments: ストアードプロシージャに渡す引数を指定します。引数は入力パラメーターに対応するものだけでよく、出力パラメーターに対応するものは不要です。 例えば、先ほど作成したストアードプロシージャを呼び出して実行するには、以下のようにします。 CALL insert_customer ('John Doe', 'john.doe@example.com'); ::: ### 参考文献 [ストアドプロシージャの使い方(PostgreSQL)](https://qiita.com/jiyu58546526/items/5dd2cb70fd2f67d5acf9) [日本語公式マニュアル](https://www.postgresql.jp/document/11/html/plpgsql.html)