質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

Q&A

解決済

2回答

2008閲覧

DB2 トリガーから実行したストアドプロシージャのパラメータ参照について教えてください。

redanntube

総合スコア6

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

0グッド

0クリップ

投稿2020/10/23 10:36

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のサイトとドキュメントよりトリガー内でのストアド呼出しとパラメーターに遷移変数を渡せるところまでは分かったのですが、ストアド内にて目的の遷移変数からレコードデータを参照する具体的な記述例がなくご教示頂きたいです。
どうぞよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

自己解決しましたので共有します。
※実行時エラーの際に表示されるエラーコードを元にIBMサイトにヒントがありました。

-4735 INVALID TABLE REFERENCE FOR TABLE LOCATOR
https://www.ibm.com/support/knowledgecenter/ja/SSEPEK_12.0.0/codes/src/tpc/n4735.html

上記よりトリガーから渡された遷移変数(この場合、表ロケーターと云うそうです)をストアドプロシージャ内で参照する記述は

CREATE PROCEDURE TARGET_TBL_PROC(IN NEWTBL TABLE LIKE TARGET_TBL AS LOCATOR) ~省略~ SELECT COLUMN_1, COLUMN_2, ... FROM TABLE (NEWTBL LIKE TARGET_TBL); ←

上記の通り、SELECT~FROMを利用して表ロケーターにアクセスする事が可能と分かりました。
なので、
INSERT文のVALUES句に値をセットしたい場合は、別途変数を宣言し
SELECT COLUMN_1 INTO V_COLUMN_1 FROM TABLE (NEWTBL LIKE TARGET_TBL);
でも値を渡せるし、

懸案のINSERT文の場合は、
INSERT INTO TBL_B (SEQ_NUMBER, COLUMN_1, COLUMN_2, 省略)
SELECT SEQ_NUM, COLUMN_1, COLUMN_2, ... FROM TABLE (NEWTBL LIKE TARGET_TBL);
でも意図した結果となります。

投稿2020/10/29 09:20

redanntube

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

0

テーブルBのINSERT文のVALUES句にセットしたい

INSERT ... SELECT ...
に変更すれば使えるのでは?その方が早いはずだし。

投稿2020/10/23 11:06

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

redanntube

2020/10/27 06:01

TBL_Bには、TARGET_TBLの更新後のNEWレコードの値をセットしたいのですが、INSERT~SELECT文にて取得可能となるものでしょうか?
Orlofsky

2020/10/27 07:57

そのために、 > AFTER INSERT ON TARGET_TBL と指定しているのでは?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問