11
14

More than 3 years have passed since last update.

ストアドプロシージャの使い方(PostgreSQL)

Last updated at Posted at 2019-10-22

ストアドプロシージャとは

 データベースに自分で定義して(データベースサーバに貯めて(stored))、後で使うことができる手続き(procedure、戻り値のない関数)です。使用することで、何回も同じSQL文を打つ必要がなくなったり、クライアントとサーバの間の通信量を減らしたりできます。

実行例

 あるテーブルの数値を取り出して(SELECT文を実行して)計算し、結果を別のテーブルに格納(INSERT文を実行)する例を見てみましょう。
 以下の2つのテーブル(operandテーブルとanswerテーブル)を使用します。operandテーブルのoperand1をoperand2で割った商を、answerテーブルのquotient列に入れて、余りを、answerテーブルのremainder列に入れるストアドプロシージャを作成してみましょう。

operandテーブル

id operand1 operand2
1 1 5
2 2 5
3 3 5
4 4 5
5 5 5

answerテーブル

id quotient remainder

ストアドプロシージャの定義

 まずストアドプロシージャを作成します。PL/pgSQLの文法に関してはPostgreSQLのマニュアルを見てください。

CREATE PROCEDURE div_proc(int) AS $$     --引数に計算したい行のidを入れる
DECLARE             --変数の宣言
ope1  int;           --operandテーブルのopernd1を入れるための変数
ope2  int;           --operandテーブルのopernd1を入れるための変数
BEGIN               --手続き内容を以下に書く
SELECT operand1 INTO ope1 FROM operand WHERE id = $1;    --operand1をope1に入れる
SELECT operand2 INTO ope2 FROM operand WHERE id = $1;    --operand2をope2に入れる
INSERT INTO answer VALUES ($1, div(ope1, ope2), mod(ope1, ope2));   --計算結果をanswerテーブルに入れる
END;               --手続き内容終わり
$$
LANGUAGE plpgsql; --言語を指定

CREATE PROCEDURE

ストアドプロシージャの利用

 作成したストアドプロシージャを利用します。関数を使う時は、SELECTを使用しますが、ストアドプロシージャの場合はCALLを使用します。

書き方:CALL ストアドプロシージャ名;

postgres=# CALL div_proc(1);
CALL
postgres=# CALL div_proc(2);
CALL
postgres=# CALL div_proc(3);
CALL
postgres=# CALL div_proc(4);
CALL
postgres=# CALL div_proc(5);
CALL

answerテーブル

id quotient remainder
1 0 1
2 0 2
3 0 3
4 0 4
5 1 0

今回のストアドプロシージャの利点

・長いSQL文を何回も書く必要がなくなりました。
・SELECT文の実行とINSERT文の実行を1回にまとめて行え、通信回数を減らせました(idを知っていることが前提ですが・・・)。

まとめ

 ストアドプロシージャを使用することで実行が楽にできるようになり、クライアントとサーバー間の通信回数を減らすことができました。
読んでくださり、ありがとうございました!

参考

PostgreSQL11のPL/pgSQLのマニュアル
https://www.postgresql.jp/document/11/html/plpgsql.html

11
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
14