表定義とデータ定義について
- ●表定義
-
NECのオフコンにはA−VX RDBという名前のリレーショナルデータベースが載っています。
RDBなので、テーブルやビューを作ったり、削除したり、変更したり、といった作業が必要になります。
A−VXの世界ではテーブルのことを基本表、ビューのことを仮想表と言い、これらを合わせて「表」と言います。そしてA−VXの世界では、テーブルやビューを作ることを「表定義」と言います。
表定義ユーティリティとは、A−VX RDBの表を作ったり、削除したり、変更したり、といったことを行う為のユーティリティです。
そして表を定義するとデータディクショナリにその情報が登録されます。
A−VXでは、プログラム(例えばCOBOLで作ったプログラム)から、SELECT、INSERT、DELETEといったDML系のSQL文は発行できるのですが、残念ながらCREATE TABLEやCREATE VIEWといったDDL系のSQL文は発行できません。
このため、表を作ったり削除したりといった作業は必ずこの表定義ユーティリティを使うことになります。
後で説明するデータ定義とは違って、プログラム上での「表定義」と表定義ユーティリティを使ってデータディクショナリに登録した「表定義」は一致していないといけません。
- ●データ定義
-
こちらの方は主にSMART系で使われますが、登録集原文を出力する機能があるのでCOBOLでも使うことはできます。
データ定義の方はいろいろと説明が必要だと思われます。
A−VXでは、順編成ファイルや相対編成ファイル、索引順編成ファイル、複数索引順編成ファイルの4つがデータファイルとして扱われます。
単純にこれらのファイルを作るならば、#ABC、#ALLOCあるいは新システム体系のデータファイルの保守といったようなユーティリティでファイルを作ることが(そして削除することも)できます。
データ定義ユーティリティの役割は2つあり、1つ目は「データファイルの定義」、つまり、どれかの種類のファイルをxxバイト(セクタ)でハードディスク上に作るということができ、これは前述の#ABC、#ALLOCなどでデータファイルを作ることと全く同じです。
重要なのは2つ目の「レコードの定義」です。
データディクショナリに、そのファイルのレコードの構成情報を登録することができます。
例えば社員ファイルというものを作るとして、そのファイルのレコード構造が「社員番号」が英数字項目6桁「社員名」が日本語項目で20桁、「部署コード」が英数字項目4桁なら、データディクショナリにその通り登録することができます。
レコードの定義をデータディクショナリに登録すると何ができるかですが、実のところそれほど役に立ちません。
まず、レコードの定義でデータディクショナリに登録を行わなくてもデータファイルは使えます。データ定義ユーティリティで「レコード定義」して次に「データファイルの定義」をして、とやらなくても、#ABCでファイルだけ作ってそれで何の支障もなくファイルを使うことができます。
プログラムとレコードの定義は全く連動していません。COBOLプログラム上で定義した「レコード定義」とデータ定義ユーティリティでデータディクショナリ上に登録した「レコード定義」が異なっていた場合、COBOLプログラム上の「レコード定義」が有効となります。
データディクショナリに一切のレコード定義の情報が登録されていなくても、あるいは全て嘘っぱちの情報でも、特に問題無くCOBOLのプログラムは動きます。プログラムの動作が遅くなるということも(たぶん)ありません。システム運用面については何の効果もありません。
じゃあ、何でレコード定義するの?ということになりますが、その理由は以下です。
・SMARTのプログラムを作成するときに項目を指定することがありますが、その時に「何桁目から何桁分」という指定ではなく、データディクショナリに登録されている項目名で指定できるようになる(SMARTの入門書には「まずデータディクショナリに登録してから、登録した項目名で指定・・」と書いてあるのでたいていは項目名で指定しているはずで、何桁目から〜なんて指定しているSMARTのプログラムはあまり見たこと無いですが・・。)
・COBOLのプログラムを作成する時に使える、レコード定義部分の登録集原文(COPY命令で使う)を作成することができる。
レコード定義を元に下のような登録集原文ができる
000010 01 SALESTRAN. 000020 02 ITEM-1 PIC X(10). 000030 02 ICODE. 000040 05 ICODE1 PIC X(2). 000050 05 ICODE2 PIC X(4). 000060 02 PRICE PIC 9(10). : :
なので、後はプログラム本文中に000100 FD SALESF. 000110 COPY SALES.
とCOPY命令を書けばいい。
・レコード定義の簡単な仕様書を印刷出力することができる。
要するにレコード定義は運用時に役に立つものではなく、プログラム開発時に役に立つというものです。
実際には、SMARTを使っているシステムの場合は、比較的正しい情報がデータディクショナリに入っていることが多いですが、それ以外の場合は正しい情報が入っている場合は少ないようです。
というのはSMARTは実行時にデータディクショナリの情報を参照して動いているようなので、うその情報が入っていると正しく動かないのですが、COBOLの場合は問題なく動いてしまいます。
当初は正しい情報が入っていたとしても、レコードの構造を変更したときに、COBOLプログラム中のレコード定義情報を直接更新してしまい、データディクショナリ上の登録情報は変更し忘れて、徐々に正しい情報から離れてしまっていることが多いです。
それ以前に表定義と異なり登録しなければならない決まりがあるわけでもなく、何も登録されていなくてもアプリケーションは問題なく動くので、そもそも何も登録されていないことが多いですね。
きちんと正しい情報が入っていれば、データディクショナリを見れば全ファイルの役割やレコード構成がわかるはずで、オープンにシステム移行するときに役に立つかもしれません。