COBOLの機能には、以下の種類がある。
本章では、これらの機能の概要を説明する。
中核機能は、データを変換、比較および演算するための基本的な機能ある。中核機能には、以下の機能がある。
※ SIT COBOLは、ポインタ操作、浮動小数点操作は未サポートである。(サポート予定あり)
データ項目または定数の内容を別のデータ項目に転記するためには、MOVE文を使う。MOVE文では、受取り側項目の属性に合わせて、桁合わせ、データの型の変換、編集などが行われる。
000000 01 送り出し項目1 PIC X(4).
000000 01 受け取り項目1 PIC X(6).
000000 :
000000 MOVE 送り出し項目1 TO 受け取り項目1.
送り出し項目1が、“ABCD” のとき、受け取り項目1には、“ABCD△△” と左詰めで転記され、残りの部分は空白(△)が補われる。
000000 01 送り出し項目2 PIC 9(2)V99.
000000 01 受け取り項目2 PIC 9(4)V9(4).
000000 :
000000 MOVE 送り出し項目2 TO 受け取り項目2.
送り出し項目1が、12.34(文字イメージは”1234”) のとき、受け取り項目1には、“00123400” と小数点位置をあわせて転記される。
000000 01 送り出し項目3 PIC 9(6).
000000 01 受け取り項目3 PIC ZZZ,ZZ9.
000000 :
000000 MOVE 送り出し項目3 TO 受け取り項目3.
送り出し項目3が、12345(文字イメージは”012345”) のとき、まず、受け取り項目1には、“△12,345” と小数点位置をあわせて転記される。先行ゼロ列が空白(△)で置き換えられ、コンマが挿入される。
加算を行うためにはADD文、減算を行うためにはSUBTRACT文、乗算を行うためにはMULTIPLY文、除算を行うためにはDIVIDE文、算術演算を行うためにはCOMPUTE文を使う。
ADD文、SUBTRACT文、MULTIPLY文、DIVIDE文およびCOMPUTE文を総称して、「算術文」という。算術文では、算術演算の結果の四捨五入、および桁あふれ条件の検査を行うことができる。四捨五入するためには、ROUNDED指定を書く。桁あふれ条件の検査を行うためには、ON SIZE ERROR指定を書く。
000000 ADD C TO A. *> A+Cの結果を、Aに格納する
000000 DIVIDE C BY D GIVING A ROUNDED *> C/Dの商を四捨五入して、Aに格納する
000000 COMPUTE A = C / D + E * 100. *> C/D + E*100の結果を、Aに格納する
選択処理を行うためには、IF文またはEVALUATE文を使う。IF文は、条件を検査し、その真理値により次の実行文を選択する。EVALUATE文は、条件を検査し、多数の処理のうちの1つを選択する。ある場所から別の場所へ無条件に分岐するためには、GO TO文を使う。
000000 IF X = Y
000000 MOVE 0 TO Z *> X = Y が真のとき、このMOVE文が実行される。
000000 ELSE
000000 GO TO P1 *> X = Y が偽のとき、このGO TO文が実行される。
000000 END-IF.
000000 :
000000 P1.
000000 :
000000 EVALUATE 点数 ALSO 出席率
000000 WHEN 85 THRU 100 ALSO 80.0
000000 MOVE "A" TO 成績 *> 点数が85-100で出席率が80%以上の人の成績は"A+"となる
000000 WHEN 85 THRU 100 ALSO ANY
000000 MOVE "A" TO 成績 *> 点数が85-100の人の成績は"A-"となる
000000 WHEN 70 THRU 84 ALSO 80.0
000000 MOVE "B" TO 成績 *> 点数が70-84で出席率が80%以上の人の成績は"B+"となる
000000 WHEN 70 THRU 84 ALSO ANY
000000 MOVE "B" TO 成績 *> 点数が70-84の人の成績は"B"となる
000000 WHEN 55 THRU 69 ALSO ANY
000000 MOVE "C" TO 成績 *> 点数が55-69の場合、成績は"C"となる
000000 WHEN OTHER
000000 MOVE "D" TO 成績 *> 点数がその他の場合、成績は"D"となる
000000 END-EVALUATE.
一連の処理を繰り返すためには、PERFORM文を使う。PERFORM文には、そとPERFORM文と、うちPERFORM文がある。
そとPERFORM文では、繰り返して実行する文を手続き名で指定する。そとPERFORM文は、手続きを繰り返して実行するだけでなく、プログラムの制御を1箇所で制御するために使うこともできる。
そとPERFORM文の例を、以下に示す。
(略)
うちPERFORM文では、繰り返して実行する文をPERFORM文の中に書く。
うちPERFORM文の例を、以下に示す。このPERFORM文の実行結果は、前述のそとPERFORM文の実行結果と同じである。
(略)
同じ属性を持つデータ項目を繰り返し定義する場合、それらをまとめて表として定義することができる。表を定義するためには、データ記述項でOCCURS句を書く。表の中の要素を、「表要素」という。表要素は、添字を付けて参照する。
表要素の反復回数は、固定にすることも可変にすることもできる。反復回数を固定にする場合、OCCURS句でDEPENDING指定を省略する。反復回数を可変にする場合、OCCURS句にDEPENDING指定を書く。この場合、OCCURS句で、反復回数の最小値と最大値を指定する。表要素の反復回数は、DEPENDING指定に書いたデータ項目に値を設定することによって指定する。OCCURS句にDEPENDING指定を指定したデータ項目を、「可変反復データ項目」という。
レコードの中には、可変反復データ項目の後に別のデータ項目を定義することができる。レコードの中で、可変反復データ項目の後に割り付けられる領域を、「レコードの中の可変位置」という。
表の定義例を、以下に示す。
(略)
可変反復データ項目を従属する集団項目を参照する文を実行した場合、可変反復データ項目の領域のうち、以下の領域が処理の対象になる。以下で、XはOCCURS句のDEPENDING指定に書いたデータ名を表し、nは処理が開始されるときのXの値を表す。
表要素に付ける添字として、整数、整数項目または指標名を使うことができる。添字に整数または整数項目を書いた場合、その値は表要素の出現番号を表す。添字に指標名を書いた場合、その値は、表要素の記憶場所を識別するための値を表す。
指標名は、表要素を識別するために使う。指標名は、OCCURS句のINDEXED
BY指定で指定する。指標名の領域は、SIT
COBOLによって生成される。添字に書く指標名は、その指標名を指定した表に含まれる指標名でなければならない。指標名の値は、SET文で設定する。
指標名の値は、SET文を使って、指標データ項目に退避することができる。指標データ項目は、指標名の値をそのまま格納するためのデータ項目である。指標データ項目は、USAGE
IS
INDEX句を書いたデータ記述項で定義する。
指標名と指標データ項目の使用例を、以下に示す。
(略)
ある条件を満足する表要素を検索するためには、SEARCH文を使う。表要素の値が既に昇順または降順に並んでいる場合は、ALL指定付きのSEARCH文を使うことができる。
ALL指定付きのSEARCH文の例を、以下に示す。
(略)
データ項目を初期化するためには、INITIALIZE文を使う。
INITIALIZE文の例を以下に示す。
000000 01 成績表.
000000 02 学籍番号 PIC X(10).
000000 02 氏名 PIC N(20).
000000 02 点数 PIC S9(4) PACKED-DECIMAL.
000000 :
000000 INITIALIZE 成績表. *> 学籍番号に空白、氏名に日本語の空白、点数にゼロが設定される
000000 INITIALIZE 成績表 REPLACING NUMERIC DATA BY 1.
000000 *> 数字項目だけ、すなわち点数だけを1に設定する。
000000 *> 学籍番号と空白は何も設定されない。
(※) SIT COBOLは、INITIALIZE文のREPLACING指定は未サポートである。(サポート予定あり)
文字列の出現回数を数えたり文字列を置き換えたりするためには、INSPECT文を使う。文字列を連結するためにはSTRING文、文字列を分解するためにはUNSTRING文を使う。
000000 77 A PIC X(10) VALUE "AB*DE*FGH*".
000000 77 B PIC 99.
:
000000 MOVE 0 TO B.
000000 INSPECT A TALLYING B FOR ALL "*" *> Aの内容を検査し、"*"の出現回数を求める。
000000 *> Bの値は3となる。
000000 77 HELLO PIC X(5) VALUE "HELLO".
000000 77 WORLD PIC X(5) VALUE "WORLD".
000000 77 HELLO-WORLD PIC X(12).
:
000000 STRING HELLO DELIMITED BY SIZE
000000 ", " DELIMITED BY SIZE
000000 WORLD DELIMITED BY SIZE
000000 INTO HELLO-WORLD. *> HELLO-WORLD には、"HELLO, WORLD"が格納される。
000000 77 HELLO PIC X(5).
000000 77 PERIOD PIC X(1).
000000 77 WORLD PIC X(5).
000000 77 HELLO-WORLD PIC X(12) VALUE "HELLO, WORLD".
:
000000 UNSTRING HELLO-WORLD INTO HELLO PERIOD WORLD.
000000 *> HELLO, PERIOD, WORLDにはそれぞれ "HELLO", ", ", "WOWRLD"が格納される。
少量のデータをPCのキーボードなどから入力するためにはACCEPT文、少量のデータをWindowsのMS-DOSプロンプトや画面などに出力するためにはDISPLAY文を使う。
ACCEPT文またはDISPLAY文を使う場合、ファイルを定義する必要はない。
ACCEPT文では、日付や時刻を得ることもできる。
ACCEPT文およびDISPLAY文の例を、以下に示す。
000000 DISPLAY "Hello, World". *> 文字定数"Hello, World"が表示される
000000 ACCEPT INP-01. *> キーボードからINP-01に値を入力する
000000 ACCEPT YYMMDD FROM DATE. *> 現在の日付をYYMMDDに格納する
プログラムの実行を終了するためには、STOP RUN文を使う。STOP RUN文は、実行単位の終了を表す。
入出力機能には、順ファイル機能、相対ファイル機能および索引ファイル機能がある。順ファイル機能は、ファイル中のレコードを決まった順序で処理する機能である。順ファイル機能で処理するファイルを、「順ファイル」という。順ファイル中の各レコードは、レコードを書き出したときの位置によって識別される。
相対ファイル機能は、ファイル中の任意のレコードを処理したり、ファイル中のレコードを決まった順序で処理する機能である。相対ファイル機能で処理するファイルを、「相対ファイル」という。相対ファイル中の各レコードは、相対レコード番号によって識別される。(*1)
索引ファイルは、ファイル中の任意のレコードを処理したり、ファイル中のレコードを決まった順序で処理する機能である。索引ファイル機能で処理するファイルを、「索引ファイル」という。索引ファイル中の各レコードは、1つまたは複数のキーの値によって識別される。
入出力機能を使うプログラムは、必要に応じて下記の記述をする。
(*1) SIT COBOLは、相対ファイル機能は未サポートである。(サポート予定あり)
ファイル名を外部媒体と関連づける。編成、呼出し法、主レコードキー、副レコードキー、ロックモードなどを指定する。
ファイルの物理的な構造を定義する。
レコード構造を定義する。
USE文にて、入出力誤り手続きを定義する。
OPEN文、READ文、WRITE文、REWRITE文、DELETE文(*1)、SATART文、CLOSE文によりファイルの入出力を行う。
(*1) 標準的なCOBOLでは、順ファイル機能ではDELETE文は利用できないが、 SIT COBOLでは利用ができる。
外部媒体上のファイルの論理的な構造を、「編成」という。ファイルの編成には、以下の4種類がある。どの編成のファイルを使うかは、ファイル管理記述項のORGANIZATION句で指定する。
順ファイル機能では、順編成および行順編成のファイルを使うことができる。相対ファイル機能では、相対編成のファイルを使うことができる。索引ファイル機能では、索引編成のファイルを使うことができる。
順編成のファイルは、レコードの直前直後の位置によって識別されるレコードで構成される。レコードの論理的な位置は、レコードを書き出したときに決まり、ファイルの終わりにレコードを追加するときを除いて変わることはない。
順編成のファイルを使う場合、ORGANIZATION句にSEQUENTIAL指定を書くか、またはORGANIZATION句を省略する。
順編成のファイルには、レコード順ファイルと印刷ファイルがある(*1)。レコード順ファイルは、外部記憶装置で入出力操作が可能なファイルである。印刷ファイルは、印刷装置に書き出すためのファイルである。レコード順ファイルと印刷ファイルのどちらのファイルを使うかは、ASSIGN句、WRITE文、レコード記述項の記述などで決まる。
(*1) SIT COBOLは印刷ファイルは未サポートである。
行順編成のファイルは、区切り文字で区切られたレコードで構成される。1つのレコードは1行と数え、1行は印刷可能な文字とレコードの区切り文字で構成される。レコードの論理的な位置は、レコードを書き出したときに決まり、ファイルの終わりにレコードを追加するときを除いて変わることはない。
行順編成のファイルを使う場合、ORGANIZATION句にLINE
SEQUENTIAL指定を書く。
相対編成のファイルは、相対レコード番号によって識別されるレコードで構成される。相対レコード番号は、1以上の整数値である。相対ファイル中のレコードは、レコードを書き出すときに、相対レコード番号が示す位置に格納される。例えば、相対レコード番号を10として書き出したレコードは、相対レコード番号が1から9までの位置にレコードが格納されていなくても、相対レコード番号が10の領域に格納される。
相対編成のファイルを使う場合、ORGANIZATION句にRELATIVE指定を書く。レコードを乱に処理する場合は、ACCESS
MODE句のRELATIVE KEY指定で、相対キー項目を指定しなければならない。
(※) SIT COBOLは、相対編成ファイルは未サポートである。(サポート予定あり)
索引編成のファイルは、レコードを識別するための索引およびレコードで構成される。索引編成のファイルは、レコード中のある領域(キー)の値によって識別される。
索引編成のファイルを使う場合、ORGANIZATION句にINDEXED指定を書く。キーは、RECORD
KEY句またはALTERNATE RECORD KEY句で指定する(*1)。RECORD
KEY句では主レコードキーを指定し、ALTERNATE RECORD
KEY句では副レコードキーを指定する。主レコードキーは、必ず指定しなければならない。
主レコードキーと副レコードキーを総称して、「レコードキー」という。レコードキーの値は、ファイル中で一意にすることも重複を許すこともできる。レコードキーの値の重複を許すためには、RECORD
KEY句またはALTERNATE RECORD
KEY句にDUPLICATES指定を書く。索引ファイル中のレコードを呼び出すために使われるレコードキーを、「参照キー」という。
参照キーは、入出力文の実行によって変化する。
(*1) SIT COBOLは、ALTERNATE RECORD KEY句指定は未サポートである。(サポート予定あり)
外部媒体上のファイルとプログラムとの関係付けは、ファイル結合子を通して行われる。 ファイル結合子は、ファイルについての情報を持つ記憶領域である。ファイル結合子は、以下の目的で使われる。
ファイル管理記述項のSELECT句とASSIGN句を書くことにより、ファイル結合子がファイル名および外部媒体上のファイルに関係付けられる。OPEN文を実行すると、ファイル結合子が確立される。
ファイルに対する処理は、入出力文(OPEN文、READ文、WRITE文、REWRITE文、START文、DELETE文およびCLOSE文)を組み合わせて書く。
ファイルに対する処理を行うためには、最初にOPEN文を実行してファイルを開かなければならない。ファイルに対する処理を終了した後、CLOSE文を実行してファイルを閉じる。OPEN文とCLOSE文の間に実行することができる入出力文は、呼出し法とオープンモードに依存する。
ファイル中のレコードを処理する順番を、「呼出し法」という。呼出し法には、順呼出し法、乱呼出し法および動的呼出し法の3種類がある。順呼出し法は、一定の順序でレコードを書き出したり読み込んだりする方法である。乱呼出し法は、任意の順序でレコードを書き出したり読み込んだりする方法である。動的呼出し法は、順呼出し法と乱呼出し法を、入出力文の実行の仕方によって切り換える方法である。
呼出し法は、ファイル管理記述項のACCESS
MODE句で指定する。順ファイルでは、順呼出し法だけを指定することができる。
ファイルを開くときのモードを「オープンモード」という。オープンモードには、入力モード、出力モード、入出力両用モードおよび拡張モードの4種類がある。どのモードでファイルを開くかは、OPEN文で指定する。
下表に、順ファイルのオープンモードと入出力文の関係を示す。
入出力文 | オープンモード(括弧内はOPEN文の指定を示す) | |||
入力モード (INPUT指定) |
出力モード (OUTPUT指定) |
入出力両用モード (I-O指定) |
拡張モード (EXTEND指定) |
|
READ文 | ○ | — | ○ | — |
WRITE文 | — | ○ | — | ○ |
REWRITE文 | — | — | ○ | — |
DELETE文(*1) | — | — | ○ | — |
(*1) SIT COBOLでは、順ファイルに対してDELETE文が使用できる。
下表に、相対ファイルおよび索引のオープンモードと入出力文の関係を示す。
呼び出し法 | 入出力文 | オープンモード(括弧内はOPEN文の指定を示す) | |||
入力モード (INPUT指定) |
出力モード (OUTPUT指定) |
入出力両用モード (I-O指定) |
拡張モード (EXTEND指定) |
||
順呼出し法 | READ文 | ○ | — | ○ | — |
WRITE文 | — | ○ | — | ○ | |
REWRITE文 | — | — | ○ | — | |
START文 | ○ | — | ○ | — | |
DELETE文 | — | — | ○ | — | 乱呼出し法 | READ文 | ○ | — | ○ | — |
WRITE文 | — | ○ | ○ | — | |
REWRITE文 | — | — | ○ | — | |
START文 | — | — | — | — | |
DELETE文 | — | — | ○ | — | 動的呼出し法 | READ文 | ○ | — | ○ | — |
WRITE文 | — | ○ | ○ | — | |
REWRITE文 | — | — | ○ | — | |
START文 | ○ | — | ○ | — | |
DELETE文 | — | — | ○ | — |
ファイル位置指示子は、一連の入出力操作において、次に処理するレコードを定めるための、概念上の指示子である。ファイル位置指示子は、入力モードまたは入出力両用モードで開いたファイルでだけ意味がある。
順ファイルのファイル位置指示子の状態は、CLOSE文、OPEN文およびREAD文の実行によって、影響を受ける。
相対ファイルおよび索引ファイルのファイル位置指示子の状態は、CLOSE文、OPEN文、READ文およびSTART文の実行によって、影響を受ける。
ボリューム指示子は、現在の物理ボリュームを一意にするための、概念上の指示子である。ボリューム指示子は、順ファイルだけに存在する概念である。ボリューム指示子の状態は、CLOSE文、OPEN文、READ文およびWRITE文の実行によって、影響を受ける。
大記憶装置の物理ファイルに対して、同時に複数の実行単位で使用可能にするか(共用モード)、または同時に1つの実行単位でだけ使用可能にするか(排他モード)という属性を、COBOLプログラムで与えることができる。
物理ファイルを共用モードと排他モードのどちらで使うかは、ファイル管理記述項のLOCK
MODE句とOPEN文で指定する。LOCK
MODE句では、翻訳単位中のOPEN文で、ファイル名に関係付けた物理ファイルを共用モードと排他モードのどちらで開くことを可能にするかを指定する。LOCK
MODE句で共用モードで開くことが可能と指定したファイルは、共用モードで開くことも排他モードで開くこともできる。LOCK
MODE句で、排他モードで開くことが可能と指定したファイルは、排他モードでだけ開くことができる。
OPEN文を実行すると、物理ファイルを共用モードと排他モードのどちらのモードで使うかが決まる。
共用モードで開いたファイルには、共用モードで開くごとに別のファイル結合子が関係付けられる。したがって、1つの物理ファイルに、同時に2つ以上のファイル結合子が関係付けられる。
排他モードで開いたファイルには、同時に1つのファイル結合子だけが関係付けられる。排他モードで開いたファイルはロックされ、別の実行単位で開くことができなくなる。排他モードで開いたファイルに対してCLOSE文を実行すると、ファイルのロックは解除され、別の実行単位で開くことができるようになる。
物理ファイルが共用モードと排他モードのどちらのモードで開かれるかを、下表に示す。
<省略>
(※) SIT COBOLはファイルの共用と排他機能は未サポートである。(サポート予定あり)
共用モードかつ入出力両用モードで開いたファイルでは、READ文で読み込んだレコードに、ロックを設定することができる。
順ファイルの場合、1つの物理ファイルの中の1つのレコードだけに、同時にロックを設定することができる。相対ファイルおよび索引ファイルの場合、1つの物理ファイルの中の1つまたは2つ以上のレコードに、同時にロックを設定することができる。1つのレコードにだけにロックを設定する場合、LOCK
MODE句でAUTOMATICを指定する。複数のレコードにロックを設定する場合、LOCK
MODE句でMANUALを指定する。
(※) SIT COBOLは、LOCK MODE句は未サポートである。(サポート予定あり)
LOCK
MODE句でAUTOMATICを指定し入出力両用モードで開いたファイルのファイル結合子は、同時に1つのレコードのロックを保持することができる。WITH
LOCK指定付きまたはWITH[ NO]
LOCK指定なしのREAD文を実行すると、読み込んだレコードにロックが設定され、ファイル結合子のロックの情報が更新される。WITH
NO
LOCK指定付きのREAD文を実行した場合は、レコードのロックは設定されない。
WITH
LOCK指定付きまたはWITH[ NO
]LOCK指定なしのREAD文を実行すると、ロックされたレコードに対して、別のファイル結合子によるロックを設定するREAD文、WRITE文、REWRITE文またはDELETE文の実行ができなくなる。ただし、拡張モードで開いたファイルのファイル結合子によるWRITE文の実行には影響を与えない。
設定されたレコードのロックは、READ文を実行したときと同じファイル結合子に対して、以下のいずれかの文を実行したときに解除される。
LOCK
MODE句でMANUALを指定し入出力両用モードで開いたファイルのファイル結合子は、同時に複数のレコードのロックを保持することができる。WITH
LOCK指定付きのREAD文を実行すると、読み込んだレコードにロックが設定され、その情報がファイル結合子に追加される。WITH
NO LOCK指定付きまたはWITH[ NO
]LOCK指定なしのREAD文を実行した場合は、レコードのロックは設定されない。
WITH
LOCK指定付きのREAD文を実行すると、ロックされたレコードの集合に対して、別のファイル結合子によるロックを設定するREAD文、WRITE文、REWRITE文またはDELETE文の実行ができなくなる。ただし、ロックされていないレコードに対する入出力文は実行可能である。設定されたレコードのロックは、READ文を実行したときと同じファイル結合子に対して、以下のいずれかの文を実行したときに解除される。
なお、複数のレコードのロックを個々に解除することはできない。
入出力状態は、入出力文の結果を示す2文字の概念上の領域である。CLOSE文、DELETE文、OPEN文、READ文、REWRITE文、START文またはWRITE文の実行中に設定される。
入出力状態および詳細情報の値は、入出力文に書いた無条件文の実行前、またはファイルに関連するUSE
AFTER STANDARD
EXCEPTION手続きの実行前に、入出力を実行するごとに設定される。入出力状態および詳細情報の値は、ファイル管理記述項にFILE
STATUS句を書くことによって、参照することができる。
入出力状態の1桁目は、入出力状態の分類を表す。入出力状態の分類を、下表に示す。
入出力状態 | 分類 | 意味 |
0x | 成功 | 入出力文の実行が成功した |
1x | ファイル終了条件 | 順呼出しのREAD文の実行が、ファイル終了条件によって不成功となった |
2x (*1) | 無効キー条件 | 入出力文の実行が、無効キー条件によって不成功になった。 |
3x | 永続誤り条件 | 入出力文の実行が、ファイルの処理の続行を妨げる誤りによって不成功になった。 |
4x | 論理誤り条件 | 入出力文の実行が、実行の順序誤りまたは利用者が定めた限界を超えたことによって、不成功となった。 |
9x | その他の誤り | 入出力文の実行が、上記以外の誤りによって不成功になった。 |
ファイルに関連するUSE AFTER STANDARD
EXCEPTION手続きが実行されるかどうかは、入出力状態によって決定される。入出力状態の分類の成功に含まれるもの以外の条件が発生したとき、そのファイル名に関連したUSE
AFTER STANDARD EXCEPTION手続きがあれば、それが実行される。
ファイル終了条件は、順呼出しのREAD文を実行したときに発生する可能性がある。ファイル終了条件が発生すると、READ文の実行は不成功になるが、ファイルは影響を受けない。ファイル終了条件が発生したかどうかは、READ文にAT END指定を書くことによって検出することができる。
無効キー条件は、相対ファイルまたは索引ファイルに対して、DELETE文、乱呼出しのREAD文、REWRITE文、START文またはWRITE文を実行したときに発生する可能性がある。無効キー条件が発生すると、入出力文の実行は不成功になるが、ファイルは影響を受けない。
無効キー条件が発生したかどうかは、入出力文にINVALID
KEY指定を書くことによって検出することができる。
ファイル属性不整合条件は、OPEN文を実行したときに発生する可能性がある。ファイル属性不整合条件が発生すると、OPEN文の実行は不成功になるが、ファイルは影響を受けない。
ファイルのレコード形式には、固定長と可変長の2つの形式がある。レコード形式は、物理的な媒体上のレコードの表現形式やレコードに付加される情報に関係なく、プログラムの記述から決まる。
固定長レコード形式の場合、ファイル中のレコードの文字位置の個数はすべて同じである。可変長レコード形式の場合、ファイル中のレコードの文字位置の個数は、レコードごとに異なる。レコード形式は、RECORD句およびレコード記述項の記述から決まる。また、WRITE文によって書き出すレコードの長さ、およびREAD文によって読み込むレコードの長さも、RECORD句およびレコード記述項の記述から決まる。
下表に、レコード形式、最大レコード長、最小レコード長を示す。
RECORD句 | レコード形式 | 最小のレコード | 最大レコード長 |
書き方1 RECORD 整数-1 |
固定長レコード形式 | 整数-1の値 | 整数-1の値 |
書き方2 RECORD VARYING [FROM 整数-2 [TO 整数-3 ]] [DEPENDING ON データ名-1] |
可変長レコード形式 | レコード記述項の長さの最小値 | レコード記述項の最大値と整数-3のうち大きい方 |
書き方3 RECORD 整数-4 TO 整数-5 またはRECORD句なし |
以下の場合、可変長レコー形式。それ以外の場合、固定長レコード形式。 - 2つ以上のレコード記述項を書き、レコード記述項の長さが異なる場合。 - レコード記述項に OCCURS DEPENDING ON句を書いた場合。 |
レコード記述項の長さの最小値(*1) | レコード記述項の長さの最大値(*1) |
(※) SIT COBOLは可変長レコードは未サポートである。(サポート予定あり)
ファイル節のレコード記述項に対して割り当てられる記憶領域を、「レコード領域」という。
1つのファイルに複数のレコード記述項を関係付けることができるが、レコード領域はレコード記述項ごとに割り当てられるのではなく、ファイルごとに割り当てられる。レコード領域の大きさは、ファイルに関係付けたレコードの最大レコード長と同じである。
レコード領域は、翻訳単位中の複数のファイルで共用することができる。レコード領域を共用するためには、環境部の入出力管理段落のSAME
RECORD AREA句に、レコード領域を共用するファイルを指定する。
(※) SIT COBOLは、SAME RECORD AREA句は未サポートである。
順ファイルのファイル記述項にLINAGE句を書いた場合、特殊レジスタLINAGE-COUNTERが生成される。LINAGE-COUNTERは、LINAGE句の整数-1またはデータ名-1の大きさと同じ大きさの符号なし整数項目として扱われる。
LINAGE-COUNTERは、入出力管理システムによって維持され、印字する行数を数えるために使われる。LINAGE-COUNTERの値は、手続き部の文でだけ参照することができる。利用者がLINAGE-COUNTERに値を設定することはできない。
(※) SIT COBOLは、LINAGE-COUNTER句は未サポートである。
プログラム間連絡機能は、2つ以上のプログラムが互いに連絡する機能である。CALL文を実行することによって、別の翻訳単位のプログラム、または同じ翻訳単位の中の別のプログラムを呼び出すことができる。CALL文を実行するプログラムを、「呼ぶプログラム」という。CALL文の実行によって制御が渡されるプログラムを、「呼ばれるプログラム」という。
プログラム間連絡機能には、呼ぶプログラムと呼ばれるプログラムの間で制御を受け渡す機能だけでなく、パラメタを受け渡したり、データおよびファイルを共用したりする機能もある。
(※) SIT COBOLは、プログラム間連絡機能はは未サポートである。(サポート予定あり)
プログラムを呼び出すためには、CALL文を実行する。呼ばれるプログラムから呼ぶプログラムへ復帰するためには、EXIT PROGRAM文を実行する。
実行時に相互に連絡して動作する実行用プログラムの集まりを、「実行単位」という。1つの翻訳単位またはいくつかの翻訳単位が集まって1つの実行単位になる。(*1)
(*1) SIT COBOLはインタプリタであり翻訳という言い方は適切ではないが、あえてこのままとする。
実行単位で最初に起動されるCOBOLプログラムを、「主プログラム」という。別のCOBOLプログラムから呼ばれるCOBOLプログラムを、「副プログラム」という。内部プログラム(*1)は、翻訳単位の一番外側のプログラムが主プログラムか副プログラムかに関係なく、つねに副プログラムである。
(*1) SIT COBOLは、内部プログラム(入れ子プログラム)はは未サポートである。
CALL文を実行すると、呼ばれるプログラムが実行可能な状態になる。そして、CALL文の記述に従って、呼ばれるプログラムの以下の文から実行が始まる。
ENTRY文は、翻訳単位の一番外側のプログラムにだけ書くことができる。
(※) SIT COBOLでは、ENTRY文は未サポートである。
呼ばれるプログラムの実行を終了するためには、EXIT PROGRAM文またはSTOP
RUN文を実行する。これらの文を総称して、「プログラム終了文」という。
プログラムの実行を終了して、呼び出したプログラムに戻るためには、EXIT
PROGRAM文を実行する。プログラムの実行を終了して、オペレーティングシステムに戻るためには、STOP
RUN文を実行する。
ファイル名(整列併合用ファイルのファイル名を除く)、レコード名、データ名(画面項目のデータ名を除く)および条件名には、大域属性と局所属性のどちらかの属性を与えることができる。
大域属性を持つ名前を「大域名」といい、局所属性を持つ名前を、「局所名」という。大域名は、その名前を定義したプログラム、およびそのプログラムが直接または間接に含むプログラムで参照することができる。局所名は、その名前を定義したプログラムでだけ参照することができる。
ファイル記述項にGLOBAL句(*1)を書くと、以下の名前が大域名になる。
レベル番号01のデータ記述項にGLOBAL句を書くと、以下の名前が大域名になる。
ファイル名、レコード名、データ名および条件名を大域名として定義しなかった場合、その名前は局所名になる。
(*1) SIT COBOLは、GLOBAL句は未サポートである。(サポート予定あり)
データ項目およびファイル結合子(整列併合用ファイルのファイル結合子を除く)には、外部属性と内部属性のどちらかの属性を与えることができる。データ項目またはファイル結合子に関連する領域を、実行単位中の複数のプログラムで共用する場合、外部属性を与える。
ファイル記述項にEXTERNAL句(*1)を書くと、そのファイル記述項に書いたファイル名に対応するファイル結合子に、外部属性が与えられる。外部属性を持つファイル結合子を、「外部ファイル結合子」という。
レベル番号01のデータ記述項にEXTERNAL句(*1)を書くと、そのデータ記述項で定義したデータ項目、およびそのデータ記述項に従属するすべてのデータ項目に、外部属性が与えられる。外部属性を持つデータ項目で構成するレコードを、「外部データレコード」という。
同じファイル名を持つ外部ファイル結合子には、実行単位中で1つの記憶領域が割り当てられます。また、同じレコード名を持つ外部データレコードには、実行単位中で1つの記憶領域が割り当てられる。外部ファイル結合子および外部データレコードは、実行単位中のすべてのプログラムから参照することができる。なお、外部ファイル結合子および外部データレコードを内部プログラムで参照する場合、参照する名前を大域名として定義する必要がある。
データ項目およびファイル結合子に外部属性を与えなかった場合、それらは内部属性を持つ。内部属性を持つデータ項目およびファイル結合子は、1つの翻訳単位の中でだけ参照することができる。外部属性を持たないファイル結合子を、「内部ファイル結合子」という。
以下の対象には、外部属性を与えることができない。これらの対象は、つねに内部属性を持つ。
(*1) SIT COBOLは、EXTERNAL句は未サポートである。(サポート予定あり)
外部プログラムは、外部名と内部名を持ち、内部プログラムは内部名だけを持つ。
外部名は、外部プログラムに付ける名前で、他のプログラムを参照する場合および他のプログラムから参照される場合に使用される。定数によって定義、参照できることから、他言語やシステムとの連携時に、COBOLの語の範囲外の名前を使用するための手段となる(*1)。
これに対して内部名は、利用者語の規則に従って定義する名前で、翻訳単位内の任意のプログラム名を表現するために利用される。
外部プログラムに対して明に外部名が定義されてない場合、内部名と同名の外部名が暗に定義されたとみなされる。
(*1) SIT COBOLは、他言語との連携は未サポートである。(サポート予定あり)
内部プログラムには共通属性を与えることができる。共通属性を持つ内部プログラムは、別のプログラムに直接含まれている場合だけでなく、その別のプログラムに直接または間接に含まれるプログラムから呼び出すことができる。共通属性を持たない内部プログラムは、そのプログラムを直接または間接に含むプログラムだけから呼び出すことができる。
内部プログラムに共通属性を与えるためには、見出し部のプログラム名段落にCOMMON句を書く。共通属性を持つ内部プログラムを、「共通プログラム」という。
(※) SIT COBOLは、プログラム段落名のCOMMON指定は未サポートである。
プログラムが実行単位中で最初に呼び出されたとき、初期化処理が行われ、以下の状態になる。このときのプログラムの状態を、「プログラムの初期状態」という。
実行単位中で2回目以降に呼び出されたときにプログラムを初期状態にするためには、以下のいずれかの方法を使う。
プログラムには初期化属性を与えることができる。初期化属性を持つプログラムは、呼び出されたときにつねに初期状態になる。
プログラムに初期化属性を与えるためには、見出し部のプログラム名段落にINITIAL句を書く。INITIAL句を書くと、INITIAL句を書いたプログラム、およびそれに直接または間接に含まれるすべてのプログラムに、初期化属性が与えられる。内部プログラムの場合、初期化属性と共通属性の両方を与えることができる。
初期化属性を持つプログラムを、「初期化プログラム」という。初期化プログラムは、そのプログラムまたはそのプログラムの二次入口点をCALL文で呼び出したときに、つねに初期状態になる。
(※) SIT COBOLは、プログラム名段落のINITIAL指定は未サポートである。(サポート予定あり)
CANCEL文によって、次に呼び出されたときのプログラムの状態を初期状態にすることができる。
CANCEL文を実行すると、CANCEL文に指定したプログラム、およびそのプログラムに直接または間接に含まれるプログラムが、次に呼び出されたときに初期状態になる。
(※) SIT COBOLは、CANCEL文は未サポートである。(サポート予定あり)
呼ぶプログラムと呼ばれるプログラムの間でパラメータを受け渡すためには、以下のようにパラメータを指定する。
CALL文のUSING指定では、呼び出されたプログラムで変更したパラメータの値を返却するかどうかを、以下のように指定する。
(※) SIT
COBOLは、CALL文は未サポートである。(サポート予定あり)
また、C言語などを直接呼び出すことはできない。
利用者語には、利用者語に付ける名前の範囲が定められている。
以下の利用者語は、定義したプログラムでだけ参照することができる。翻訳単位中の2つ以上のプログラムで同じ名前を定義することができるが、定義したプログラムでだけ参照することができる。
以下の利用者語は、翻訳単位中のすべてのプログラムで参照することができる。ただし、翻訳時(*1)に、参照する実体を翻訳単位に関係付ける必要がある。
(*1) SIT COBOLの場合はインタプリタなので実行時となる。
以下の利用者語は、定義したプログラムおよびそのプログラムに直接または間接に含まれるプログラムで参照することができる。
(※) SIT COBOLは、いずれも未サポートである。(サポート予定あり)
以下の利用者語は、大域属性の有無によって名前の範囲が異なる。
これらの利用者語に大域属性を与えた場合、その利用者語は、定義したプログラムおよびそのプログラムに直接または間接に含まれるプログラムで参照することができる。大域属性を与えなかった場合は、定義したプログラムでだけ参照することができる。
大域属性を持つ利用者語を定義したプログラムに直接または間接に含まれるプログラムでは、大域属性を持つ利用者語と同じ名前の利用者語を定義して、複数の対象を同じ名前で参照することができる。
あるプログラム(プログラムA)が別のプログラム(プログラムB)を直接含み、ある利用者語(利用者語X)を2つ以上のプログラムで定義し、利用者語XをプログラムBで参照する場合、以下の規則を順に適用することによって、参照する対象が識別される。
(※) SIT COBOLは、大域属性(COMMON)指定は未サポートである。
表に指標名を関係付けた場合、表に付けたデータ名が大域属性を持つときは指標名も大域属性を持つ。指標名の名前の範囲は、対応する表に付けたデータ名の名前の範囲と同じである。
(※) SIT COBOLは、大域属性(COMMON)指定は未サポートである。
1つの翻訳単位を構成するプログラムのプログラム名および二次入口名は、互いに同じであってはいけない。
2つ以上の翻訳単位で1つの実行単位を構成する場合、各翻訳単位の一番外側のプログラムのプログラム名および二次入口名は、互いに同じであってはいけない。しかし、内部プログラムには、別の翻訳単位を構成するプログラムのプログラム名または二次入口名と同じ名前を付けることができる。
プログラム名は、そのプログラムの見出し部のプログラム名段落で宣言される。プログラム名には外部名と内部名があり、CALL文およびCANCEL文で、同一翻訳単位内のプログラムを指す場合には内部名を、同一翻訳単位外のプログラムを指す場合には外部名を参照し、プログラム終わり見出しは内部名を参照する。
実行単位を構成するプログラムに割り当てられる外部名は、一意でなければならない。内部名は一意である必要はないが、実行単位中の2つのプログラムが同一の名前の場合、これらの2つのプログラムの少なくとも1つは、他方を含まない別の翻訳単位中に直接または間接に含まれていなければならない。
プログラム名および二次入口名は、別のプログラム中のCALL文またはCANCEL文で参照することができる。CALL文およびCANCEL文で参照することができるプログラム名および二次入口名を、以下に示す。
(※) SIT COBOLは、ENTRY文は未サポートである。
手続き部見出しにRETURNING指定のないプログラムに関連して、特殊レジスタRETURN-CODEが自動的に生成される。
RETURN-CODEは、オペレーティングシステムまたは呼び出したプログラムに復帰コードを渡すために使うことができる。RETURN-CODEは、“COMP-2”と定義した数字項目として扱われる。
プログラムの実行が始まったときのRETURN-CODEの値は、ゼロである。RETURN-CODEに復帰コードを設定した後、プログラム終了文を実行すると、復帰コードが以下のように渡される。
※ SIT COBOLは、整列併合機能は未サポートである。(サポート予定あり)
原始文操作機能は、プログラムの一部を取り込んだり置き換えたりして、翻訳時にプログラムを完成させるための機能である。
原始文操作機能には、COPY文とREPLACE文がある。これらの文は、翻訳時、他の文が翻訳される前に処理される。実行時には意味を持たない。(*1)
COPY文は、プログラムの一部をCOBOL登録集から複写するために使う。COBOL登録集は、プログラムとは別に作成し、翻訳時にプログラムと関係付ける。
REPLACE文は、プログラムの一部を置き換えるために使う。(*2)
COPY文およびREPLACE文は、プログラムおよびCOBOL登録集の任意の位置に書くことができる。
(1) SIT
COBOLはインタープリタであり実行が開始される直前に処理される。
(2)
SIT COBOLは、REPLACE文は未サポートである。(サポート予定あり)
組込み関数機能は、いくつかの引数の値を基に特定の処理を行い、その結果をプログラムに返却する機能である。関数の値を「関数値」という。
組込み関数機能は、手続き部の文の中で使うことができる。文の中に関数一意名を書くことによって、組込み関数機能を使うことができる。
SIT11がサポートしている組込み関数の一覧を、下記に示す。
関数名 | 関数値 |
ACOS | 引数の逆余弦 |
ANNUITY | 毎期の均等払い額 |
ASIN | 引数の逆正弦 |
ATAN | 引数の逆正接 |
CHAR | 文字の大小順序において、引数の順序位置にある1文字 |
COS | 引数の余弦 |
CURRENT-DATE | 現在の日付と時刻 |
DATE-OF-INTEGER | 通日形式の日付を標準形式の日付に変換したもの |
DAY-OF-INTEGER | 通日形式の日付を年日形式の日付に変換したもの |
FACTORIAL | 引数の階乗 |
INTEGER | 引数の値以下の最大の整数 |
INTEGER-OF-DATE | 標準形式の日付を通日形式の日付に変換したもの |
INTEGER-OF-DAY | 年日形式の日付を通日形式の日付に変換したもの |
INTEGER-PART | 引数の整数部 |
LENGTH | 引数の長さ(文字位置または日本語文字位置の個数) |
LOG | 引数の自然対数 |
LOG10 | 引数の常用対数 |
LOWER-CASE | 引数の中の英大文字を英小文字に置き換えたもの |
MAX | 引数の並びの中の最大値 |
MEAN | 引数の並びの算術平均値 |
MEDIAN | 引数の並びの中央値 |
MIDRANGE | 引数の並びの中の最小値と最大値の算術平均値 |
MIN | 引数の並びの中の最小値 |
MOD | 第2引数を法とする第1引数の整数値 |
NUMVAL | 数字定数の形式の文字列を数値に変換したもの |
NUMVAL-C | 数字定数の形式の文字列(通貨記号またはコンマを含む)を数値に変換したもの |
ORD | 文字の大小順序における、引数の順序位置 |
ORD-MAX | 最大値を持つ引数の位置 |
ORD-MIN | 最小値を持つ引数の位置 |
PRESENT-VALUE | 各期末の現在価値 |
RANDOM | 疑似乱数 |
RANGE | 引数の並びの中の最大値と最小値の差 |
REM | 第1引数を第2引数で割ったときの余り |
REVERSE | 引数の文字列を逆順にしたもの |
SIN | 引数の正弦 |
SQRT | 引数の平方根 |
STANDARD-DEVIATION | 引数の並びの標準偏差 |
SUM | 引数の並びの総和 |
TAN | 引数の正接 |
TRIM | 文字列の左右の空白を取り除く(空白は、日本語空白も含む) |
UPPER-CASE | 引数の中の英小文字を英大文字に置き換えたもの |
VARIANCE | 引数の並びの分散 |
WHEN-COMPILED | プログラムを翻訳したときの日付と時刻 |
コマンド行には、引数として、COBOLプログラムに渡すパラメタを指定することができる。引数の個数および値は、コマンド行引数の操作機能を使って参照することができる。
(※) SIT COBOLは、コマンド行引数操作機能は未サポートである。(サポート予定あり)
環境変数の値は、環境変数の操作機能を使って参照したり更新したりすることができる。
環境変数の値を参照するためには、ENVIRONMENT-VALUE、ENVIRONMENT指定のACCEPT文を使用する。
機能名ENVIRONMENT-VALUEに対応付けた呼び名をFROM指定に書いた場合は、特殊レジスタENVIRONMENT-NAMEに設定されている環境変数の値が一意名に設定される。
000000 01 環境変数値 PIC X(10).
000000 :
000000 MOVE "XYZ" TO ENVIRONMENT-NAME.
000000 ACCEPT 環境変数値 FROM ENVIRONMENT-VALUE. *> '環境変数値'に、環境変数XYZの値が
000000 *> 設定される。
機能名ENVIROMENTに対応付けた呼び名をFROM指定に書いた場合は、その直後にかかれている定数またはデータ名の値で指定された環境変数の値が一意名に設定される。
000000 01 環境変数値 PIC X(10).
000000 :
000000 ACCEPT 環境変数値 FROM ENVIRONMENT "XYZ". *>'環境変数値'に、環境変数XYZの値が
000000 *> 設定される。
詳しくは、“ACCEPT文”を参照されたい。
環境変数の値を更新するにはENVIRONMENT指定のSET文を使用する。
000000 SET ENVIRONMENT "ABC" TO "XYZ". *> 環境変数ABCに値"XYZ"を設定する。
詳しくは、“SET文”を参照されたい。
(※) SIT COBOLでは、DISPLAY文による環境変数の更新機能は未サポートである。
SIT COBOLは、Windowsのファイルやディレクトリについての操作機能を、組み込みサブルーチンとして提供している。
組み込みサブルーチンの名前および機能については、opensource
COBOLに準拠している。
詳しくは”組み込みサブルーチン”を参照されたい。
埋込みSQLとは、アプリケーション・プログラムに記述されているSQL文のことである。 SQL文を含むアプリケーション・プログラムはホスト・プログラムと呼ばれ、 その記述言語はホスト言語と呼ばれる。たとえば、SIT COBOLの場合は、COBOLがホスト言語となる。
データベース(*1)の操作および問合せには、INSERT文、UPDATE文、DELETE文およびSELECT文を使用する。 INSERTではデータの行をデータベース表に追加し、UPDATEでは行を変更し、DELETEでは不要な行を削除し、SELECTでは検索条件と一致する行を取り出す。
また、テーブルの作成CREATE、削除DROP等も行うことができる。
(*1)SIT COBOLがサポートしているデータベースは、SQLITE3である。
終了