DB2のストアドプロシージャの実装方法についてご教示ください。
データベース製品:IBM Db2 11 for z/OS
経緯
とあるトランザクション対象のテーブルに対してINSERT、UPDATE、DELETE操作を行った際、
履歴として変更前のレコードを別テーブルのAとBに保管するという業務要件があります。
トリガーにてテーブルAとテーブルBに対するINSERT文を発行していたのですが、仕様変更により、
テーブルAで採番された「通番」をテーブルBにも保持させようとしております。
※テーブルAは対象テーブルに対するCRUD種別を管理する、テーブルBは変更前のレコードを履歴として管理します
ところが、z/OS版のDB2ではトリガー内に変数を定義、使用する事ができないという制限があり、
止むを得ず、トリガー内で行っていたINSERT文をストアドプロシージャで処理する方法に切り替えようとしております。
テーブル構成
CREATE TABLE TBL_A( -- 通番は自動採番項目 SEQ_NUMBER BIGINT GENERATED ALWAYS AS IDENTITY(START WITH 1, INCREMENT BY 1, NO CYCLE, MAXVALUE 9223372036854775807), CRUD CHAR(1) FOR MIXED DATA NOT NULL WITH DEFAULT, TABLE_NAME CHAR(50) FOR MIXED DATA NOT NULL WITH DEFAULT );
CREATE TABLE TBL_B( SEQ_NUMBER BIGINT, COLUMN_1 CHAR(10) FOR MIXED DATA NOT NULL WITH DEFAULT, COLUMN_2 CHAR(20) FOR MIXED DATA NOT NULL WITH DEFAULT, ・・・ COLUMN_N CHAR(20) FOR MIXED DATA NOT NULL WITH DEFAULT );
トリガー
CREATE TRIGGER TARGET_TBL_TRI AFTER INSERT ON TARGET_TBL REFERENCING NEW TABLE AS NTBL FOR EACH ROW MODE DB2SQL BEGIN ATOMIC // テーブルAとBへのINSERT処理を行うプロシージャの呼出し // 履歴を管理する為に更新後レコードを参照する為の遷移変数をパラメーターとして渡している CALL TARGET_TBL_PROC(TABLE NTBL); END
ストアドプロシージャ(問題点)
CREATE PROCEDURE TARGET_TBL_PROC(IN NEWTBL TABLE LIKE TARGET_TBL AS LOCATOR) LANGUAGE SQL DYNAMIC RESULT SETS 0 MODIFIES SQL DATA BEGIN // テーブルAで自動採番された通番をテーブルBに渡す為の変数 DECLARE SEQ_NUM BIGINT; // テーブルAへのINSERTと結果の取得 SELECT A.SEQ_NUMBER INTO SEQ_NUM FROM FINAL TABLE ( INSERT INTO TBL_A ~省略~ ) AS A; // テーブルBへのINSERT処理 INSERT INTO TBL_B (SEQ_NUMBER, COLUMN_1, COLUMN_2, ~省略~) // ここでパラメーターからレコードを参照したいが実行時エラーが発生してしまう VALUES(SEQ_NUM, NEWTBL.COLUMN_1, NEWTBL.COLUMN_2, ~省略~); END
質問事項
上記の流れにてストアドプロシージャ内にてトリガーから取得した遷移変数を参照して
テーブルBのINSERT文のVALUES句にセットしたいのですが、記述方法が解らず難儀しております。
IBMのサイトとドキュメントよりトリガー内でのストアド呼出しとパラメーターに遷移変数を渡せるところまでは分かったのですが、ストアド内にて目的の遷移変数からレコードデータを参照する具体的な記述例がなくご教示頂きたいです。
どうぞよろしくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/29 09:31