私は、常にデフォルトの例外ハンドラーを持ち、スローされた例外に関数名を追加して再度スローする方法で PostgreSQL 関数を作成する傾向があります。
例:
BEGIN
RAISE exception SQLSTATE '77777' using message = 'Test exception';
EXCEPTION
WHEN others THEN
raise exception
using message = 'error_handling_test: ' || sqlstate
|| '/' || sqlerrm;
END;
この場合、SQLSTATE 77777 はそれ以上伝播されず、後でキャッチした例外にはデフォルトの SQLSTATE P0001 があります。
例外ハンドラの昇格にも SQLSTATE を追加することは可能ですが、これはハードコードされた文字列に限定されるようです。私が取得したいのは、次のようなものです。
DECLARE
err_code varchar;
BEGIN
RAISE exception SQLSTATE '77777' using message = 'Test exception';
EXCEPTION
WHEN others THEN
err_code:=sqlstate;
raise exception sqlstate err_code
using message = 'error_handling_test: ' || sqlstate
|| '/' || sqlerrm;
END;
これはコンパイルされません。