社内SEの徒然なる日記

NetCOBOLでOracleに接続してみた

NetCOBOLでOracle接続

使用するのはNetCOBOL
こいつ、Oracleとの接続は、結局Pro*COBOLだったりするようです。
最初、この関係が分らなくてWEBから資料を探すのが大変だった...

こうなった

試行錯誤のすえ、こんな感じになりました。
Oracleに接続して、何もせずに終了する処理です。

WORKING-STORAGE SECTION.
*
* 埋込みSQL宣言節の開始
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
*
* ORACLE接続コネクト用変数
01 USERNAME PIC X(016) VARYING. *> ユーザーID
01 PASSWD PIC X(016) VARYING. *> パスワード
01 DBSTRING PIC X(016) VARYING. *> 接続データベース

* 埋込みSQL宣言節の終了
EXEC SQL END DECLARE SECTION END-EXEC.
*
* オラクル共通
EXEC SQL INCLUDE SQLCA END-EXEC.
*
PROCEDURE DIVISION.
*
* *> 接続情報を設定
COMPUTE USERNAME-LEN = FUNCTION
STORED-CHAR-LENGTH("<ユーザ名>").
MOVE EV-WK-USERNAME TO USERNAME-ARR.
COMPUTE PASSWD-LEN = FUNCTION
STORED-CHAR-LENGTH("<パスワード>").
MOVE EV-WK-PASSWORD TO PASSWD-ARR.
COMPUTE DBSTRING-LEN = FUNCTION
STORED-CHAR-LENGTH("<接続先>").
MOVE EV-WK-DBSTRING TO DBSTRING-ARR.
*
* *> コネクト処理
EXEC SQL
CONNECT :USERNAME IDENTIFIED BY :PASSWD
USING :DBSTRING
END-EXEC.
*
* *> コミット!
* EXEC SQL COMMIT END-EXEC.
*
* *> ロールバック!
EXEC SQL ROLLBACK END-EXEC.
*
EXIT PROGRAM.


解説1 EXEC SQL ~ END-EXEC

そもそも、COBOLにはDBとやり取りするって機能が無いので、COBOL内に無理やりOracleとやり取りする部分を埋め込みます。
そのやり取りする部分ってのが、「EXEC SQL」から「END-EXEC」までの間になります。
なので、この範囲内の記述については、COBOL自体の書式とはかけ離れた記述方法になります。

解説2 ホスト変数

ホスト変数とはSQL文中に記述し、条件や値を受けとることが出来る変数のことです。
逆にいえば、ホスト変数以外はSQL文中に記述できません。


EXEC SQL BEGIN DECLARE SECTION END-EXEC.

ホスト変数

EXEC SQL END DECLARE SECTION END-EXEC.


「 DATA DIVISION. 」 の 「 WORKING-STORAGE SECTION. 」に記述します。
EXEC SQL BEGIN DECLARE SECTION END-EXEC.とEXEC SQL END DECLARE SECTION END-EXEC.で囲まれた範囲に宣言された変数がホスト変数となります。

解説3 VARYING

ホスト変数のVARYINGってのは、可変長文字列ということです。
COBOLには固定長文字列(Xタイプ)しかないですが、Oracleには可変長文字列があります。
VARYINGと定義することで、COBOL側で可変長文字列に相当する受け皿(VARCHAR擬似型っていうらしいです)を作成できます。

この変数はプリコンパイラを通すと、下記のように2つの変数に分解されます。

01 USERNAME.
02 USERNAME-LEN PIC S9(8) COMP-5.
02 USERNAME-ARR PIC X(16).


まぁ、ここまでくれば分ると思いますが、***-LENには長さが、***-ARRには値が入ります。
サンプルでは、ユーザ名、パスワード、接続先のそれぞれで値と長さ設定しています。

長さの設定は、STORED-CHAR-LENGTH関数を使用します。
(NetCOBOLの専用関数で、実際の長さを返却します)

解説4 接続!

接続は、こんな感じです。

EXEC SQL
CONNECT :USERNAME IDENTIFIED BY :PASSWD
USING :DBSTRING
END-EXEC.


ホスト変数として定義した3つの変数を設定して接続します。
ホスト変数を使用する時は、変数の前に:(コロン)を付けて下さい。

解説5 セッション制御

コミットかロールバックを記述します。
上記のサンプルでは、あえてコミットをコメント化してロールバックだけ実行しています。

*> コミット!
EXEC SQL COMMIT END-EXEC.


*> ロールバック!
EXEC SQL ROLLBACK END-EXEC.


コミットもロールバックも指定しないでプログラムを終了した場合は、自動的にロールバックが実行されます。
なので省略しても良いのですが、普通はちゃんと書くでしょうね。
まぁ、一種のマナーみたいなものでしょうか。

ちなみに、セッション制御だけなので、Oracleからの切断はされません。

解説6 切断

上記のサンプルには書きませんでしたが、切断する方法は2つあります。
一つは、セッション制御文を使用する方法です。

*> コミット!
EXEC SQL COMMIT WORK RELEASE END-EXEC.


*> ロールバック!
EXEC SQL ROLLBACK WORK RELEASE END-EXEC.

「WORK RELEASE」の記述を追加しました。
これで、セッション制御文の発行と同時にOracleから切断されます。

もう一つの方法が、DISCONNECT文を使用する方法です。
...が、実際にはわざわざ使用する理由がないので試したことがありません。
なので、ここでも書けませんね。

ぶつぶつ独り言

私の会社の基幹システムって、バッチ処理はCOBOLだったりします。
オープン系でオンライン処理はJavaで、バッチ処理のみCOBOLなのですよ。

とはいえ、昔のホストコンピュータがあった時代みたいに、芸術的な(つまり読めない)ロジックを実装するんでなく、SQLを実行するための基盤みたいな使い方なんですよね。
なんか、なおさらCOBOLでなくてもいいような気がするんだけどなぁ。

ここまで愚痴っといてなんですが、別にCOBOLが嫌いなわけじゃないです。
固定長のテキストファイルを扱うのなら、この言語が一番便利じゃないです?

次回:NetCOBOLでのホスト変数の使い方
投稿記事の一覧:目次


スポンサードリンク

PageTop

コメント


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