## 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)