
■ 同一DB複数接続
ふと気になったのですが、同じデータベースに複数回接続したらどうなるんでしょうか?ちょっと実験してみましょうか。
基本的には前回までと同じソースを使用、接続先を分けた上で、それぞれからINSERT文を発行し、片方をロールバック、もう片方をコミットします。
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-DBNAME2 PIC X(010).
*
EXEC SQL END DECLARE SECTION END-EXEC.
EXEC SQL INCLUDE SQLCA END-EXEC.
*
PROCEDURE DIVISION.
*
* Oracle接続文字列の設定(DWH1)
MOVE "user01" TO H-USERNAME.
MOVE "oracle" TO H-PASSWD.
MOVE "db1" TO H-DBSTRING.
MOVE "setu1" TO H-DBNAME.
*
* Oracle接続(DWH1)
EXEC SQL
CONNECT :H-USERNAME IDENTIFIED BY :H-PASSWD
AT :H-DBNAME
USING :H-DBSTRING
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)
DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
*
* Oracle接続文字列の設定(DWH2)
MOVE "setu2" TO H-DBNAME2.
*
* Oracle接続(DWH2)
EXEC SQL
CONNECT :H-USERNAME IDENTIFIED BY :H-PASSWD
AT :H-DBNAME2
USING :H-DBSTRING
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)
DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
*
* INSERT文(DWH)
EXEC SQL
AT :H-DBNAME
INSERT
INTO TEST商品
(商品CD,商品名)
VALUES ('AAAAA1','テスト')
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)
DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
*
* INSERT文(DWH2)
EXEC SQL
AT :H-DBNAME2
INSERT
INTO TEST商品
(商品CD,商品名)
VALUES ('AAAAA2','テスト')
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)
DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
*
* ロールバック(DWH1)
EXEC SQL
AT :H-DBNAME
ROLLBACK WORK RELEASE
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)
DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
*
* コミット(DWH2)
EXEC SQL
AT :H-DBNAME2
COMMIT
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)
DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
*
EXIT PROGRAM.
意図していたのは、「片方のINSERT文の実行結果だけが反映される」だったんですけが、見事に期待に応えてくれました。
これは使えそうですね。
■ 後書き
正常系だけを考えれば、1つのデータベースに接続して片方の実行結果だけ反映(コミット)させたいなんてことは無いと思います。しかし、異常系まで考えればそうでもありません。
何らかのエラーで処理が異常終了した時に、エラー内容をログに吐き出すのですが、ログ、つまりテキストベースの情報だけでは原因調査が難しい場合があります。このような場合、実際にエラーが発生した個所はロールバックされているので原因調査に時間を要することが多いです。
今回の方法を使えば、異常発生時に別のトランザクションを開始してエラー情報を吐くことも可能かもしれません。
・・・実装は大変ですけどね。
前回:NetCOBOLで複数のDBに接続したい! No6 トランザクション
次回:NetCOBOLで複数のDBに接続したい! No8 動的SQL
投稿記事の一覧:http://harikofu.web.fc2.com/
--- blog end ---
スポンサードリンク


