【SQL】ストアド ~ 例外処理 ~

■ はじめに

ストアドの例外処理について扱う

目次

【1】ストアド の 例外ハンドリング
 1)構文
【2】ストアド の 例外スロー
 1)構文
【3】カスタム例外を作成する
 1)構文
【4】サンプル
 例1:Hello world
 例2:独自例外

【1】ストアド の 例外ハンドリング

* EXCEPTION句でキャッチする

Snowflake
https://docs.snowflake.com/ja/sql-reference/snowflake-scripting/exception
PostgreSQL
https://www.postgresql.jp/document/12/html/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING

1)構文

BEGIN
  ...
EXCEPTION
    WHEN <exception_name> [ OR <exception_name> ... ] THEN
        <statement>;
    [ WHEN ... ]
    [ WHEN OTHER THEN ]
        <statement>;
END

【2】ストアド の 例外スロー

* RAISE EXCEPTION でスローする

1)構文

RAISE EXCEPTION '【メッセージ】';

【3】カスタム例外を作成する

* 独自例外を作成するには、RAISE EXCEPTION USINGを使う

1)構文

RAISE EXCEPTION USING
      ERRCODE='【Error Code】',
      MESSAGE='【Error Message】',
      HINT='【Error Hint】';

PostgreSQ
https://www.postgresql.jp/document/8.4/html/errcodes-appendix.html

【4】サンプル

SQL Fiddle
https://www.db-fiddle.com/

例1:Hello world

CREATE OR REPLACE PROCEDURE demo_stored_procedure(arg1 INT)
  LANGUAGE plpgsql
AS $$ 
DECLARE
  value1 INT := arg1;
BEGIN
  IF value1 > 5 THEN
    RAISE EXCEPTION  'Error occurred' ;
  END IF;
EXCEPTION
WHEN OTHERS THEN
  RAISE INFO 'Error SQLERRM: %', SQLERRM;
  RAISE INFO 'Error SQLSTATE: %', SQLSTATE;
  -- Re-throw error
  RAISE EXCEPTION '[ERROR] Error: %...', SQLERRM;
END
$$

-- 呼び出し

-- 通常
CALL demo_stored_procedure(1);
-- エラー発生
CALL demo_stored_procedure(6);
-- Query Error: [ERROR] Error: Error occurred...

例2:独自例外

CREATE OR REPLACE PROCEDURE demo_stored_procedure(arg1 INT)
  LANGUAGE plpgsql
AS $$ 
DECLARE
  value1 INT := arg1;
BEGIN
  IF value1 > 5 THEN
    RAISE EXCEPTION USING
      ERRCODE='XX999',
      MESSAGE='This is a sample exception',
      HINT='This is a hint';
  END IF;
EXCEPTION
WHEN SQLSTATE 'XX999' then
  RAISE INFO 'SQLSTATE = %', SQLSTATE;
  RAISE INFO 'SQLERRM = %', SQLERRM;
  -- Re-throw error
  RAISE EXCEPTION '[ERROR] Error: %!!!!?', SQLERRM;
WHEN OTHERS THEN
  RAISE INFO 'Error SQLERRM: %', SQLERRM;
  RAISE INFO 'Error SQLSTATE: %', SQLSTATE;
  -- Re-throw error
  RAISE EXCEPTION '[ERROR] Error: %...', SQLERRM;
END
$$

-- 呼び出し

-- 通常
CALL demo_stored_procedure(1);
-- エラー発生
CALL demo_stored_procedure(10);
-- Query Error: [ERROR] Error: This is a sample exception!!!!?

参考文献

https://qiita.com/kudojp/items/3115467ba6a61b0fe1f5
https://atmarkit.itmedia.co.jp/ait/articles/1909/18/news008.html
https://qiita.com/ebichan_88/items/1effb09fbc458276ea51

関連記事

ストアド ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2010/08/06/112528
ストアド ~ 基本編 / 変数 ~
https://dk521123.hatenablog.com/entry/2013/01/25/002936
ストアド ~ 基本編 / 繰り返し ~
https://dk521123.hatenablog.com/entry/2012/06/22/213026
ストアド ~ 基本編 / 条件分岐 ~
https://dk521123.hatenablog.com/entry/2024/11/12/005529
PostgreSQL】ストアド ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2014/04/21/000100
PostgreSQL】ストアド ~ SELECT INTO ~
https://dk521123.hatenablog.com/entry/2024/11/11/212756
SQL ~ 関係演算 / 集合論
https://dk521123.hatenablog.com/entry/2023/01/16/000000