----
⌣ ''[[PL/pgSQL入門ページに戻る>PL/pgSQL入門]]''
----

* エラー時のメッセージ出力・RAISE EXCEPTION [#rbd348b0]
前回の記事「[[ターミナルにメッセージ出力>PL/pgSQL/ターミナルにメッセージを表示する]]」では、levelがEXCEPTIONを除くRAISEのサンプルおよび動作を紹介しました。~
今回は、EXCEPTIONのサンプルおよび動作を紹介します。~
(先に結論を書きますと、EXCEPTIONの場合、ROLLBACKされます。)

#contents
#htmlinsertpcsp(db-top.html,db-sp.html)

* RAISEの動作確認 [#i869e92d]
RAISEの構文について以下に記します。~
前回の記事のraise_sample.sqlを少々改造し、データをINSERTするようにします。~
** テスト用テーブルの作成 [#jd6a96e4]
#ref(t1.sql)
 CREATE TABLE t1 (
      i  int
     ,t  text
 );

** EXCEPTIONを除いたRAISEのサンプルおよび実行 [#af657599]
以下のコマンドで、上記のテーブルを作成しました。
 $ psql -U sakura sakuradb -f t1.sql 
 CREATE TABLE

EXCEPTIONを除いたサンプルソースは以下のようになります。~
#ref(raise1.sql)

 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テーブルがすでに作成されていることが前提です。

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


** RAISE EXCEPTIONのサンプルおよび実行 [#v8226d09]
本題となるEXCEPTIONの動作確認を行います。~
本ファンクションは、上記と同様にt1テーブルが作成されていることが前提です。
#ref(raise_exp.sql)
 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を指定しています。~
以下に登録および実行結果を記します。
+raise_exp.sqlを登録します。
 sakuradb=# \i raise_exp.sql
 CREATE FUNCTION
+t1テーブルのレコードをすべて削除します。
 sakuradb=# delete from t1;
 DELETE 3
 sakuradb=# select * from t1;
  i | t 
 ---+---
 (0 rows)
+raise_exp()を実行します。
ERROR: メッセージで表示されているのが確認できます。
 sakuradb=# select raise_exp();
 ERROR:  EXCEPTION RAISE MESSAGE
+t1テーブルの内容を確認します。~
INSERTされていないことが確認できます。
 sakuradb=# select * from t1;
  i | t 
 ---+---
 (0 rows)

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

** 後作業 [#l411e1e7]
本記事で作成した、raise1(), raise_exp(), t1 をDROPします。
 sakuradb=# drop function raise1();
 DROP FUNCTION
 sakuradb=# drop function raise_exp();
 DROP FUNCTION
 sakuradb=# drop table t1;
 DROP TABLE

* まとめ [#r9791857]
+ RAISE EXCEPTION するとROLLBACKされる
+ EXCEPTION以外のレベルを指定すると、COMMITされている

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

----
⌣ ''[[PL/pgSQL入門ページに戻る>PL/pgSQL入門]]''

#htmlinsertpcsp(db-btm.html,db-sp.html)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS