社内SEの徒然なる日記

NetCOBOLで複数のDBに接続したい! No6 トランザクション

■ トランザクション

このシリーズを書き始めた時からずっと気になっていたのは、トランザクションの動作です。

片方のデータベースから参照して、もう片方のデータベースに登録(更新)する場合、参照側のデータベースはコミットする必要がありません。

そういうこと、ちゃんと出来るんでしょうか?

■ 指定なし

接続した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 --- スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する