
■ トランザクション
このシリーズを書き始めた時からずっと気になっていたのは、トランザクションの動作です。
片方のデータベースから参照して、もう片方のデータベースに登録(更新)する場合、参照側のデータベースはコミットする必要がありません。
そういうこと、ちゃんと出来るんでしょうか?
■ 指定なし
接続した2つのデータベース(テーブル)に1件ずつデータを登録(INSERT)して、コミットしてみます。
コミット文は「EXEC SQL COMMIT END-EXEC.」として、接続先を指定しないで実行してみます。
IDENTIFICATION DIVISION.
PROGRAM-ID. DBTEST00.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
DATA DIVISION.
*
WORKING-STORAGE SECTION.
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 H-USERNAME PIC X(010).
01 H-PASSWD PIC X(010).
01 H-DBSTRING PIC X(010).
01 H-DBNAME PIC X(010).
*
01 H-USERNAME2 PIC X(010).
01 H-PASSWD2 PIC X(010).
01 H-DBSTRING2 PIC X(010).
01 H-DBNAME2 PIC X(010).
*
EXEC SQL END DECLARE SECTION END-EXEC.
EXEC SQL INCLUDE SQLCA END-EXEC.
*
PROCEDURE DIVISION.
*
* Oracle接続文字列の設定(DWH)
MOVE "user01" TO H-USERNAME.
MOVE "oracle" TO H-PASSWD.
MOVE "db1" TO H-DBSTRING.
MOVE "setu1" TO H-DBNAME.
*
* Oracle接続(DWH)
EXEC SQL
CONNECT :H-USERNAME IDENTIFIED BY :H-PASSWD
AT :H-DBNAME
USING :H-DBSTRING
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)
DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
*
* Oracle接続文字列の設定(基幹)
MOVE "user02" TO H-USERNAME2.
MOVE "oracle" TO H-PASSWD2.
MOVE "db2" TO H-DBSTRING2.
MOVE "setu2" TO H-DBNAME2.
*
* Oracle接続(基幹)
EXEC SQL
CONNECT :H-USERNAME2 IDENTIFIED BY :H-PASSWD2
AT :H-DBNAME2
USING :H-DBSTRING2
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)
DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
*
* INSERT文(DWH)
EXEC SQL
AT :H-DBNAME
INSERT
INTO TEST商品
(商品CD,商品名)
VALUES ('AAAAAA','テスト')
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)
DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
*
* INSERT文(基幹)
EXEC SQL
AT :H-DBNAME2
INSERT
INTO TESTFAX
(FAXKEY)
VALUES ('AAAAAA')
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)
DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
*
* コミット
EXEC SQL
COMMIT
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)
DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
*
EXIT PROGRAM.
結果、コミットでログインエラーが発生しました。
SQLCODE = -000001012 [ORA-01012: ログオンされていません。 ]
これまでの記事の内容から、AT句が必要だとは思ってたんですが、予想通りだったみたいですね。
■ AT句(片方)
今度は、AT句を付けてみます。DWH側はロールバック、基幹側はコミットします。サンプルコードを全部書くと長いので、コミットの部分だけ差替えて読んでください。
*
* ロールバック(DWH)
EXEC SQL
AT :H-DBNAME
ROLLBACK WORK RELEASE
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)
DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
*
* コミット (基幹)
EXEC SQL
AT :H-DBNAME2
COMMIT
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)
DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
結果、基幹側(コミットを発行した方)のINSERT文だけ更新されました。
■ 後書き
ここまでの実験で、1本のプログラムで複数のデータベースに接続して色々出来ることが検証できました。
次回、同じデータベースに複数接続してみます。
前回:NetCOBOLで複数のDBに接続したい! No5 接続(複数)
次回:NetCOBOLで複数のDBに接続したい! No7 同一DB複数接続
投稿記事の一覧:http://harikofu.web.fc2.com/
--- blog end ---
スポンサードリンク


