前回の記事「ターミナルにメッセージ出力」では、levelがEXCEPTIONを除くRAISEのサンプルおよび動作を紹介しました。
今回は、EXCEPTIONのサンプルおよび動作を紹介します。
(先に結論を書きますと、EXCEPTIONの場合、ROLLBACKされます。)
RAISEの構文について以下に記します。
前回の記事のraise_sample.sqlを少々改造し、データをINSERTするようにします。
CREATE TABLE t1 (
i int
,t text
);
以下のコマンドで、上記のテーブルを作成しました。
$ 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テーブルがすでに作成されていることが前提です。
$ psql -U sakura sakuradb psql (9.3.14) Type "help" for help.
sakuradb=# select count(*) from t1;
count
-------
0
(1 row)sakuradb=# \i raise1.sql CREATE FUNCTION
sakuradb=# select raise1(); INFO: INFO RAISE MESSAGE foo NOTICE: NOTICE RAISE MESSAGE foo,123 WARNING: WARNING RAISE MESSAGE raise1 -------- (1 row)
sakuradb=# select * from t1; i | t ---+------ 1 | foo 2 | bar 3 | hoge (3 rows)上記の実行結果の通り、3件INSERTされているのが確認できます。
本題となる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を指定しています。
以下に登録および実行結果を記します。
sakuradb=# \i raise_exp.sql CREATE FUNCTION
sakuradb=# delete from t1; DELETE 3 sakuradb=# select * from t1; i | t ---+--- (0 rows)
sakuradb=# select raise_exp(); ERROR: EXCEPTION RAISE MESSAGE
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
以上、RAISE EXCEPTION についての記事でした。