最近functionを初めて作った事があって書き方を整理してみました。
CREATE OR REPLACE FUNCTION f_getsomething(in_ymd date)
RETURNS TABLE (a numeric
, b integer
, c integer)
AS $$
-- 戻り値:a(コメント)、b(コメント)、c(コメント)
DECLARE
one_rec RECORD;
cur_data cursor(in_ymd date) is
-- ~SQL文~
;
BEGIN
FOR one_rec IN cur_data($1) -- C#のforeachみたいにcur_dataから1行ごどに出して処理する
LOOP -- LOOPからEND LOOP内の内容を繰り返す
IF NOT FOUND then -- もしcur_dataに何も入ってない場合のデフォルト値
a := 0;
b := 0;
c := 0;
ELSE
a := one_rec.a; -- 3つのデータを上で宣言した変数に入れる
b := one_rec.b;
c := one_rec.c;
END IF;
RETURN NEXT; -- 結果集合(塊)に1行を追加する、LOOPが進めて行くと共に結果集合に行が増える
END LOOP;
RETURN; -- 結果集合を戻り値で返す
END;
$$ LANGUAGE plpgsql;
functionを使用して処理をプログラム側とデータベース側で分ける事ができ、選択地は増えました。
だが逆にどこまでプログラム側で処理して、どこまでDB側でやるかを決めるのが難しいです。
function処理はデバックで追いかけるのができない?と聞いてるのでC#みたいにエラーの原因探りも難しいそうです。
経験を積むしかないのかと思います。
参考:https://qiita.com/ester41/items/3401606322888a0a7f21
https://eatsmart.hatenablog.com/entry/2019/03/01/155838