社内SEの徒然なる日記

COBOLで環境変数が更新出来ない!

■ 環境

Cシェルで環境変数を設定して、COBOLを起動。COBOLでは、Cシェルで設定した環境変数を取得&更新って処理を行うプログラムを作ったのですが、環境変数の更新が上手く行きません。

なお、COBOLは富士通のNetCOBOLを使っています。

■ ソース

まず、Cシェルはこんな感じにします。

#!/bin/csh
# 環境変数の設定
setenv IDTJOB "1"
# COBOL実行
TESTENV
# 環境変数の表示
echo $IDTJOB


環境変数「IDTJOB」に"1"を設定し、COBOLプログラム「TESTENV」を実行、終了後、環境変数「IDTJOB」の値を出力するってだけのものです。

次はCOBOL側です。

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
ENVIRONMENT-NAME IS ENV-N
ENVIRONMENT-VALUE IS ENV-V.

WORKING-STORAGE SECTION.
01 EV-IDTJOB.
10 EV-C-IDTJOB PIC X(006) VALUE "IDTJOB". *> パラメータ変数名
10 EV-WK-IDTJOB PIC X(030). *> パラメータ取得変数

PROCEDURE DIVISION.

* *> ①環境変数「IDTJOB」を取得
DISPLAY EV-C-IDTJOB UPON ENV-N.
ACCEPT EV-WK-IDTJOB FROM ENV-V.

* *> 取得した環境変数の値を表示
DISPLAY "IDTJOB = [" EV-WK-IDTJOB "]".

* *> 環境変数「IDTJOB」を取得した項目を上書き
MOVE "ABC" TO EV-WK-IDTJOB.

* *> ②環境変数「IDTJOB」の更新
DISPLAY EV-C-IDTJOB UPON ENV-N.
DISPLAY EV-WK-IDTJOB UPON ENV-V.

* *> ③環境変数「IDTJOB」を再取得
DISPLAY EV-C-IDTJOB UPON ENV-N.
ACCEPT EV-WK-IDTJOB FROM ENV-V.

* *> 更新した環境変数「IDTJOB」を表示
DISPLAY "new IDTJOB = [" EV-WK-IDTJOB "]".


要約すると、こんな処理です。
① DISPLAY文、ACCEPT文で環境変数を取得
② DISPLAY文で環境変数の値を上書き
③ DISPLAY文、ACCEPT文で環境変数を再取得

...ソースは本物から抜粋&改変しているので、どっか変なところがあるかも。まぁ、意味は分かるでしょ。

■ 結果

この処理を実行すると、COBOL側の最後のDISPLAY文の結果は変更した値「ABC」が表示されるのですが、Cシェルに戻って実行したechoコマンドは変更前の「1」が表示されます。

...あれ?なんで元に戻る?

COBOL側では変更した結果が確認できるので、プログラムは悪くないと思われます。そうすると、COBOL側の「環境変数の更新」の有効範囲がどこまでなのかってことが気になります。

■ 原因

幸い、NetCOBOLはサポート契約を結んでいるので問合せをして見ました。
すると、返ってきた答えは「NetCOBOLの環境変数の更新は、プロセス内にしか影響しない」です。まぁ、予想通りですね。

もうちょっと言うと、COBOLは、一つのプログラム=一つのプロセスって扱いなので、プロセスの外になるCシェルには影響を及ぼせないって事ですね。

■ 対応

ということは、COBOLの実行結果で環境変数の値を更新するには、更新したい値をファイルに出力して、Cシェル側で更新するって方法が正攻法でしょうか?

概要は、こんな感じですか。

setenv IDJOBFIL /var/tmp/IDTJOB.txt

 :
 : COBOLで↑で設定したファイルに更新したい値を出力する。
 :

setenv IDTJOB `cat $IDJOBFIL`


ちょっと省略しすぎですね。

説明すると、COBOL側で更新したい値をテキストファイル「IDTJOB.txt」に出力しておきます。
んで、Cシェル側ではテキストファイルの内容を出力するcatコマンドの実行結果を環境変数に設定します。

■ 愚痴

まぁ、外部から受け取ったパラメータの書き換えが出来ないのは良くある話なので、プログラムを組む前から薄らと想像していた事ではあったんですよ。
ただ、NetCOBOLのマニュアル(COBOL文法書)の環境変数の項目を見ると、「環境変数が更新できます」って事しか書いておらず、もしかすると出来るのかと思って試してみた次第なのです。

外部パラメータの更新って処理なんだから、制限事項とかで注意書きとかあっても良いと思うんですけど。
まぁ、これが出来ちゃうと、環境変数の値が意図せずに書き換えられて、妙な障害の原因になりかねないので、出来なくて正解なのかも知れませんね。

スポンサードリンク

PageTop

コメント


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