社内SEの徒然なる日記

NetCOBOLで複数のDBに接続したい! No2 接続

■ 普通の接続

前回(NetCOBOLで複数のDBに接続したい! No1 始めに
)書いた通り、複数のデータベースに接続したいのです。

とりあえず、普通の接続処理を書いてみます。最小限のソースに抑えたかったので、色々と端折ってます。

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(008).
01 H-PASSWD PIC X(008).
01 H-DBSTRING PIC X(003).
EXEC SQL END DECLARE SECTION END-EXEC.
EXEC SQL INCLUDE SQLCA END-EXEC.
*
PROCEDURE DIVISION.
*
* Oracle接続文字列の設定

MOVE "user01" TO H-USERNAME.
MOVE "oracle" TO H-PASSWD.
MOVE "db1" TO H-DBSTRING.
*
* Oracle接続(DWH)

EXEC SQL
CONNECT :H-USERNAME IDENTIFIED BY :H-PASSWD
USING :H-DBSTRING
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)

DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
EXIT PROGRAM.


■ 複数接続用の情報追記(ホスト変数)

複数のデータベースに接続するという事は、処理の中でデータベースにアクセスする時に、「どちらのデータベースに対して処理を実行するのか」という事を指定する必要があると思います。

色々と調べてみると、その考えで間違えていなかったようで、CONNECT文を発行する時にAT句を指定すれば良いらしいです。

上記のソースに、複数接続に必要な情報を追記します。
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(008).
01 H-PASSWD PIC X(008).
01 H-DBSTRING PIC X(003).
01 H-DBNAME PIC X(010).
EXEC SQL END DECLARE SECTION END-EXEC.
EXEC SQL INCLUDE SQLCA END-EXEC.
*
PROCEDURE DIVISION.
*
* Oracle接続文字列の設定

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 "]".
EXIT PROGRAM.


■ 複数接続用の情報追記(直接指定)

上記ではホスト変数を使用しましたが、直接指定することも出来るようです。
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(008).
01 H-PASSWD PIC X(008).
01 H-DBSTRING PIC X(003).
EXEC SQL END DECLARE SECTION END-EXEC.
EXEC SQL INCLUDE SQLCA END-EXEC.
*
PROCEDURE DIVISION.
*
* Oracle接続文字列の設定

MOVE "user01" TO H-USERNAME.
MOVE "oracle" TO H-PASSWD.
MOVE "db1" TO H-DBSTRING.
*
* データベース名の指定

EXEC SQL DECLARE setu1 DATABASE END-EXEC.
*
* Oracle接続(DWH)

EXEC SQL
CONNECT :H-USERNAME IDENTIFIED BY :H-PASSWD
AT setu1
USING :H-DBSTRING
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)

DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
EXIT PROGRAM.


変数宣言も不要だし、こっちの方がスマートな気もするのですが、ホスト変数の方が無難な気がします。

例えば、接続処理をソースコードの最後に書くように作ったとします。
PROCEDURE                        DIVISION.
INIT-RTN SECTION.
*
* DB接続

PERFORM ORA-CONECT-SEC.
*
* SQL発行





*
EXIT PROGRAM.
INIT-EXT.
EXIT.
*
*DB接続ルーチン
ORA-CONECT-SEC SECTION.




ORA-CONECT-EXIT.
EXIT.


このような書き方の場合、プリコンパイルが通りません(正確には、SQLを発行する箇所でエラーになる)。これは、プリコンパイラはロジックを見ないという特性により発生すると思います。

後の記事で書いていきますが、SQLを発行する時にデータベース名(サンプルではsetu1)を指定することになります。単純にソースを上から下に眺めた場合、初めてsetu1が発生するのはCONNECT文の発行箇所ではなく、それより上の部分になります。

よって、プリコンパイラが通りません。

■ 後書き

何にせよ、AT句で制御するところまでは理解出来ました。ここから実際にSQLを発行してみたいと思います。

前回:NetCOBOLで複数のDBに接続したい! No1 始めに
次回:NetCOBOLで複数のDBに接続したい! No3 SELECT文

投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end --- スポンサードリンク

PageTop

コメント


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