コンテキストスタックを取得する
他の言語でいうスタックトレースに相当するスタックのコンテキストを取得すると、複雑で入れ子になった関数のデバッグにとても有効です。
以下のコードでは、スタックのコンテキストを取得し、ネストされた両方のブロックの例外ハンドラーで記録したいと考えています。続いて、errors テーブルでその出力を確認し、この関数で例外が起きている原因の調査に役立てます。
この演習はコースの一部です
PostgreSQL におけるトランザクションとエラー処理
演習の手順
- スタックのコンテキストを保持する text 変数
exc_contextを宣言します。 - 最初のハンドラーで、
PG_EXCEPTION_CONTEXTをexc_context変数に格納します。 - 2 つ目のハンドラーで、
PG_EXCEPTION_DETAILをexc_detail変数に格納します。 - 両方のブロックで、エラーメッセージとスタックのコンテキストの両方を記録します。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
DO $$
DECLARE
exc_message text;
exc_details text;
-- Declare a variable, exc_context to hold the exception context
___ ___;
BEGIN
BEGIN
INSERT INTO patients (a1c, glucose, fasting) values (5.6, 93, TRUE),
(6.3, 111, TRUE),(4.7, 65, TRUE);
EXCEPTION
WHEN others THEN
-- Store the exception context in exc_context
GET STACKED DIAGNOSTICS exc_message = MESSAGE_TEXT,
___ = ___;
-- Record both the msg and the context
INSERT INTO errors (msg, context)
VALUES (___, ___);
END;
BEGIN
UPDATE patients set fasting = 'true' where id=1;
EXCEPTION
WHEN others THEN
-- Store the exception detail in exc_details
GET STACKED DIAGNOSTICS exc_message = MESSAGE_TEXT,
___ = ___;
INSERT INTO errors (___, ___)
VALUES (exc_message, exc_context);
END;
END$$;
SELECT * FROM errors;