Quantcast
Channel: プログラミング
Viewing all articles
Browse latest Browse all 7991

【SQL】ストアド ~ 例外処理 ~ - プログラム の超個人的なメモ

$
0
0

■ はじめに

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

目次

【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
  ...
EXCEPTIONWHEN<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 EXCEPTIONUSING
      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

CREATEORREPLACEPROCEDURE demo_stored_procedure(arg1 INT)
  LANGUAGE plpgsql
AS $$ 
DECLARE
  value1 INT := arg1;
BEGINIF value1 > 5THEN
    RAISE EXCEPTION'Error occurred' ;
  ENDIF;
EXCEPTIONWHEN 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:独自例外

CREATEORREPLACEPROCEDURE demo_stored_procedure(arg1 INT)
  LANGUAGE plpgsql
AS $$ 
DECLARE
  value1 INT := arg1;
BEGINIF value1 > 5THEN
    RAISE EXCEPTIONUSING
      ERRCODE='XX999',
      MESSAGE='This is a sample exception',
      HINT='This is a hint';
  ENDIF;
EXCEPTIONWHEN 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


Viewing all articles
Browse latest Browse all 7991

Trending Articles