このエントリーをはてなブックマークに追加 Yahoo!ブックマークに登録

[smile] PL/pgSQL入門ページに戻る


エラー時のメッセージ出力・RAISE EXCEPTION

前回の記事「ターミナルにメッセージ出力」では、levelがEXCEPTIONを除くRAISEのサンプルおよび動作を紹介しました。
今回は、EXCEPTIONのサンプルおよび動作を紹介します。
(先に結論を書きますと、EXCEPTIONの場合、ROLLBACKされます。)


スポンサーリンク

RAISEの動作確認

RAISEの構文について以下に記します。
前回の記事のraise_sample.sqlを少々改造し、データをINSERTするようにします。

テスト用テーブルの作成

CREATE TABLE t1 (
     i  int
    ,t  text
);

EXCEPTIONを除いたRAISEのサンプルおよび実行

以下のコマンドで、上記のテーブルを作成しました。

$ psql -U sakura sakuradb -f t1.sql 
CREATE TABLE

EXCEPTIONを除いたサンプルソースは以下のようになります。

CREATE OR REPLACE FUNCTION raise1()
RETURNS
    void
AS $$
DECLARE
    foo text := 'foo';
    bar int  := 123;
BEGIN
    INSERT INTO t1 VALUES(1,'foo'),(2,'bar'),(3,'hoge');
    RAISE DEBUG   'DEBUG RAISE MESSAGE';
    RAISE LOG     'LOG RAISE MESSAGE';
    RAISE INFO    'INFO RAISE MESSAGE %', foo;
    RAISE NOTICE  'NOTICE RAISE MESSAGE %,%', foo, bar;
    RAISE WARNING 'WARNING RAISE MESSAGE';
END
$$ LANGUAGE plpgsql
;

raise1()の登録および実行してみます。
本サンプルは上記に記したt1テーブルがすでに作成されていることが前提です。

  1. データベースに接続
    $ psql -U sakura sakuradb
    psql (9.3.14)
    Type "help" for help.
  2. t1テーブルに何も無いことを確認しています。
    sakuradb=# select count(*) from t1;
     count 
    -------
         0
    (1 row)
  3. raise1.sqlを登録しています。
    sakuradb=# \i raise1.sql
    CREATE FUNCTION
  4. raise1()ファンクションを実行します。
    sakuradb=# select raise1();
    INFO:  INFO RAISE MESSAGE foo
    NOTICE:  NOTICE RAISE MESSAGE foo,123
    WARNING:  WARNING RAISE MESSAGE
     raise1 
    --------
     
    (1 row)
  5. t1テーブルの内容を確認します。
    sakuradb=# select * from t1;
     i |  t   
    ---+------
     1 | foo
     2 | bar
     3 | hoge
    (3 rows)
    上記の実行結果の通り、3件INSERTされているのが確認できます。

RAISE EXCEPTIONのサンプルおよび実行

本題となるEXCEPTIONの動作確認を行います。
本ファンクションは、上記と同様にt1テーブルが作成されていることが前提です。

CREATE OR REPLACE FUNCTION raise_exp()
RETURNS
    void
AS $$
DECLARE
BEGIN
    INSERT INTO t1 VALUES(1,'exp_foo'),(2,'exp_bar'),(3,'exp_hoge');
    RAISE EXCEPTION 'EXCEPTION RAISE MESSAGE';
END
$$ LANGUAGE plpgsql
;

上記の通り、RAISEのレベルにEXCEPTIONを指定しています。
以下に登録および実行結果を記します。

  1. raise_exp.sqlを登録します。
    sakuradb=# \i raise_exp.sql
    CREATE FUNCTION
  2. t1テーブルのレコードをすべて削除します。
    sakuradb=# delete from t1;
    DELETE 3
    sakuradb=# select * from t1;
     i | t 
    ---+---
    (0 rows)
  3. raise_exp()を実行します。 ERROR: メッセージで表示されているのが確認できます。
    sakuradb=# select raise_exp();
    ERROR:  EXCEPTION RAISE MESSAGE
  4. t1テーブルの内容を確認します。
    INSERTされていないことが確認できます。
    sakuradb=# select * from t1;
     i | t 
    ---+---
    (0 rows)

以上の結果の通り、デフォルトであるオートコミット状態でRAISE EXCEPTIONが実行されるとROLLBACKされているのが確認できます。

後作業

本記事で作成した、raise1(), raise_exp(), t1 をDROPします。

sakuradb=# drop function raise1();
DROP FUNCTION
sakuradb=# drop function raise_exp();
DROP FUNCTION
sakuradb=# drop table t1;
DROP TABLE

まとめ

  1. RAISE EXCEPTION するとROLLBACKされる
  2. EXCEPTION以外のレベルを指定すると、COMMITされている

以上、RAISE EXCEPTION についての記事でした。


[smile] PL/pgSQL入門ページに戻る


スポンサーリンク


添付ファイル: filet1.sql [詳細] fileraise_exp.sql [詳細] fileraise1.sql [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-10-24 (月) 14:24:09 (87d)