DB2 9.5 で SQLプロシージャ(1)
今日は、先週辺りから課題となっている、SQLプロシージャについて
とりあえず、DOC_IDを元に、DELETE-INSERTするプロシージャhoge1を作ってみた。
CREATE PROCEDURE hoge01 ( IN ic_DOC_ID VARCHAR(16) ,OUT oi_SQLCODE INT ,OUT oc_SQLSTATE CHAR(5) ) SPECIFIC hoge01 LANGUAGE SQL DETERMINISTIC NO EXTERNAL ACTION MODIFIES SQL DATA BEGIN /*--------------------------------------------------------*/ /* 変数の宣言 */ /*--------------------------------------------------------*/ DECLARE vtemp CHAR(10); DECLARE SQLCODE INT DEFAULT 0; --SQLCODE (0:データが戻された,100:データが戻されない) DECLARE SQLSTATE CHAR(5) DEFAULT '00000'; --SQLSTATE DECLARE oc_DOC_ID CHAR(16) DEFAULT ' '; -- 条件ハンドラー用 DECLARE vi_NOT_FOUND INT DEFAULT 0; /*--------------------------------------------------------*/ /* カーソルの宣言 */ /*--------------------------------------------------------*/ /*--------------------------------------------------------*/ /* 条件ハンドラーの宣言 */ /*--------------------------------------------------------*/ DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SET vtemp = SQLSTATE || CAST(SQLCODE AS CHAR(5)); SET oc_SQLSTATE = SUBSTR(vtemp,1,5); SET oi_SQLCODE = INT(SUBSTR(vtemp,6,5)); END; /*--------------------------------------------------------*/ /* ステートメント */ /*--------------------------------------------------------*/ SET oc_DOC_ID = ic_DOC_ID; DELETE FROM XXX WHERE DOC_ID = ic_DOC_ID ; INSERT INTO XXX VALUES ( oc_DOC_ID, .. ) ; COMMIT; END @
うん、うまく行った。正常系は。
はてさて、例外処理はどうするのが普通なのか?
SQL経験者のためのSQLプロシージャー入門(http://www-6.ibm.com/jp/software/data/db2univ/data/sqlprocedure.pdf)を読んでみるが、[NOT FOUND][SQLEXCEPTION][SQLWARNING][カスタム]について軽く載っているだけでサンプルも軽すぎて参考にならず。