----
⌣ ''[[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)