Open4

PostgreSQLで関数を作りたい

masa5714masa5714

PostgreSQLの関数を作るとき、 CREATE OR REPLACE FUNCTION でいきなり関数を作ってしまうと、記述ミスがあったときに都度 DROP FUNCTION を実行しなければならず、かなり面倒くさい。

ということで、関数を作るまでの流れを確立したいのでスクラップに書き殴っていく。

masa5714masa5714

関数を作成せずに関数っぽい作りで記述する方法

DO $$
DECLARE
  -- 変数があればここに書いていく
BEGIN
  -- ここに実行したいSQL文を書いていく
END $$;

これが基本形。
DECLARE とは変数の宣言をするところ。

masa5714masa5714

DECLARE の使い方

JSなどとは異なり「変数の宣言」と「値の格納」は別々にする必要がある。
面倒だがそういうものなので仕方がない。

select * from hoge で取得した値を全部変数に格納したい場合

DO $$
DECLARE -- 2パターン記述してますが、どちらか一方でいいです。
  v_hoge hoge; -- テーブル名「hoge」のデータを格納するならこっちの型
  v_join_hoge record; -- 色んなテーブルのデータが入りそうならrecord型
BEGIN

  -- INTOによって変数への格納を実行している
  SELECT * INTO v_hoge from hoge where id = 1;

END $$;

▼ 指定した値だけ変数に入れたいとき

DO $$
DECLARE
  v_public_id uuid; -- uuidを変数に入れたい
BEGIN

  SELECT public_id INTO v_public_id from hoge where id = 1;

END $$;

型が書かれた一覧はないのか?

https://www.postgresql.jp/document/9.3/html/datatype.html

あります。
こちらのページの「表 8-1. データ型」の「名称」の箇所に書かれている箇所を見ればOKだと思います。この型は関数を作った後にデータを返すために RETURN QUERY をした値を RETURNS TABLE() で返却値と型を指定する際にも使用します。

masa5714masa5714

変数の中身を確認したい

変数の中身を確認するのも手間だ。

DO $$
DECLARE
  v_hoge hoge;
BEGIN

  SELECT * INTO v_hoge from hoge where id = 1;
  RAISE NOTICE '結果: %', v_hoge;

END $$;

RAISE NOTICE '結果: %', v_hoge; この記述によって変数の中身を確認できる。 % はここに結果を出力してくれという命令。 , の右の v_hoge はどの変数を % にぶち込むかを指定している。