ステートメント
本章では、OpenFrame PL/Iのステートメントの使用方法について説明します。
1. ALLOCATEステートメント(略語: ALLOC)
ALLOCATEステートメントは、被制御変数または基底付き変数のストレージを割り当てます。
1.1. 被制御変数のALLOCATEステートメント
ALLOCATEステートメントは、被制御変数にストレージを割り当てます。同時に被制御パラメータも割り当てることができます。ALLOCATEステートメントに被制御変数の配列の境界、文字列の長さを指定することができます。

配列の境界、文字列の長さは、ALLOCATEステートメントの実行時に計算されます。
-
ALLOCATEステートメントまたはDECLAREまたはDEFAULTステートメントに必要なサイズと文字列の長さが指定されている必要があります。
-
ALLOCATEステートメントにDIMENSION属性と文字列の長さが指定された場合、変数宣言に記述されている属性の代わりになります。
-
ALLOCATEステートメントに境界、文字列の長さがアスタリスク(*)で記述された場合、現行世代の情報を使用します。変数の現行世代が存在しない場合は、その情報は未定義となり、プログラムはエラーになります。
-
ALLOCATEステートメントに記述されたDIMENSION属性は、宣言された次元の数値に合わせて記述しなければなりません。すなわち、1次元の配列であれば、DIMENSION属性が1つ記述され、2次元の配列の場合は2つ、 ...、n次元の配列の場合にはnつのDIMENSION属性が記述される必要があります。
-
BIT、CHARACTE、GRAPHICの属性は、DECLAREステートメントに記述されている属性と同じである必要があります。
以下は、ALLOCATEステートメントを使用した例です。
DCL X(M,N) CHAR(L) CTL; M = 10; N = 5; L = 100; ALLOCATE X(5,5) CHAR(200);
2. ASSIGNステートメント
代入ステートメントは、式を計算し、その結果を複数のターゲット変数に割り当てます。このとき、ターゲット変数または疑似変数の属性がソースの属性と異なる場合があるので、データ変換が必要になる場合があります。

項目 | 説明 |
---|---|
reference |
ターゲット変数または疑似変数を記述します。 |
expression |
ソースの式です。 |
BY NAME |
構造体割り当てに使用されるオプションです。詳細については、割り当ての実行を参照してください。 |
複合代入ステートメント
複合代入ステートメントは、複合代入演算子を使用して割り当てを行います。

項目 | 説明 |
---|---|
reference |
ターゲット変数または疑似変数を記述します。 |
compound operator |
割り当てが行われる前に、ソースとターゲットに適用する演算子を記述します。 複合代入ステートメントに使用可能な複合代入演算子は以下のとおりです。
|
expression |
ソースの式です。 |
以下は、複合代入ステートメントの実行例です。
X += 5; ==> X = X + 5; X *= Y - 1; ==> X = X * (Y - 1);
ターゲット変数
ターゲット変数は、要素変数、配列変数、構造体変数または疑似変数にすることができます。
-
配列ターゲット
-
ターゲットは、スカラーまたは構造体の配列である必要があります。ソースは、スカラー式であるか、そのターゲットと同じ次元数と境界を持つ式でなければなりません。
-
-
構造体ターゲット
-
BY NAMEが記述されている場合、各ターゲットは構造体である必要があり、ソースも構造体でなければなりません。
-
BY NAMEが記述されていない場合、各ターゲットは構造体であり、ソースはスカラーまたはターゲットと同じ構造の構造体でなければなりません。
-
BY NAMEが記述されていない場合、ソースをNULL文字列("")にすると、以下のように処理されます。
-
すべてのターゲットは、'00’Xで埋められます。
-
すべての数値ターゲットは0に設定されます。
-
すべての文字およびグラフィック・ターゲットは空白で埋められます。
-
-
割り当ての実行
-
配列割り当て
-
すべての配列演算子(ソースとターゲット)は、同じ次元数と境界を持つ必要があります。
-
配列の割り当ては、以下のようにループに展開されます。
DO I1 = LBOUND( target-variable, 1 ) to HBOUND( target-variable, 1 ); DO I2 = LBOUND( target-variable, 2 ) to HBOUND( target-variable, 2 ); ... DO IN = LBOUND( target-variable, N ) to HBOUND( target-variable, N ); generated element assignment ; END;
-
Nは、ターゲットの次元数です。生成された代入ステートメントでは、I1からINを添え字として使用します。ソースがスカラーである場合は、添え字は適用されません。
-
-
構造体割り当て
-
BY NAMEが記述されてない場合、以下のように処理されます。
-
すべての演算子は配列であってはならず、同じ構造を持つ構造体である必要があります。メンバーとして配列を含むことはできます。
-
それぞれのメンバー別に割り当てで拡張します。メンバーがn個であれば、n個の割り当てが実行されます。
-
メンバー割り当てが、再び集合割り当てである場合は、拡張されて処理されます。
-
-
BY NAMEが記述されている場合、以下のように処理されます。
-
ターゲット構造体の最初から、メンバー名と同じ名前をソース・メンバーから検索します。このときメンバーは、構造体のすぐ下のレベル(チャイルド)のみを探します。チャイルドのチャイルドは検索しません。
-
見つからなかった場合は、2番目のメンバー、3番目のメンバーなど、見つかるまで繰り返します。
-
見つかったメンバーが構造体または構造体の配列の割り当てである場合は、BY NAMEオプションが付けられます。
-
見つかったメンバーがスカラーまたはスカラーの配列の場合は、エレメント割り当てを実行します。
-
他のメンバーに上記の操作を同様に適用します。
-
-
以下は、BY NAMEを使用した構造体割り当ての例です。
DCL 1 ONE, DCL 1 TWO, DCL 1 THREE 2 PART1, 2 PART1, 2 PART1, 3 RED, 3 BLUE, 3 RED, 3 ORANGE, 3 GREEN, 3 BLUE, 2 PART2, 3 RED, 3 BROWN, 3 YELLOW, 2 PART2, 2 PART2, 3 BLUE, 3 BROWN, 3 YELLOW, 3 GREEN; 3 YELLOW; 3 GREEN;
-
4. CALLステートメント
CALLステートメントは、サブルーチンを呼び出します。

項目 | 説明 |
---|---|
entry-reference |
呼び出されるサブルーチンの名前を指定します。 |
generic-name |
GENERIC属性で宣言される変数名を指定します。 |
built-in name |
組み込み関数の名前を指定します。 |
argument |
呼び出されるサブルーチンに渡されるデータ項目を指定します。 |
5. CLOSEステートメント
CLOSEステートメントは、指定したファイルを閉じます。

項目 | 説明 |
---|---|
FILE |
対象ファイルを指定します。アスタリスク(*)を使用して、開いているファイルをすべて閉じることができます。 |
6. DECLAREステートメント
DECLAREステートメントは、データ項目の名前と一部またはすべての属性を記述することができます。明示的に属性が記述されず、コンテキストによって判別できない場合は、デフォルト属性が適用されます。

項目 | 説明 |
---|---|
* |
スカラー、レベル1データの名前として記述することはできません。 |
attributes |
宣言されるデータの属性を記述します。任意の順序で記述できます。詳細については、 データ・タイプと属性を 参照してください。 |
level |
ゼロ以外の整数である必要があります。スカラー、配列データを宣言するときは記述する必要はなく、レベル1になります。 |
name |
宣言されるデータの名前を記述します。レベル1の名前は、同じブロック内で一意である必要があります。 |
条件接頭語とレベルは、DECLAREステートメント上には記述できません。 |
7. DEFAULTステートメント(略語: DFT)
DEFAULTステートメントは、属性セットが完全ではない場合にデータ属性のデフォルトを定義します。
暗黙宣言とコンテキスト宣言または部分的に完全な明示宣言の場合、DEFAULTステートメントが適用されない属性については、言語に固有のデフォルトが適用されます。
DEFAULTステートメントはENTRY属性またはFILE属性で宣言された名前を除いて、すべての別の属性を再定義します。ただし、VARIABLEを暗示する属性のない名前は、DEFAULTステートメントが適用される前にPL/Iによって暗黙的にCONSTANT属性が提供されます。構造体と共用体のエレメントには、修飾されたエレメントの名前ではなく、エレメントの名前に応じてデフォルト属性が適用されます。

identifier:
項目 | 説明 |
---|---|
RANGE(identifier) |
同じ文字で始まる名前に適用されます。 |
RANGE(identifier : identifier) |
2つのIDで指定された文字で始まる名前またはアルファベット順で2つのIDの中間にある名前に適用されます。 |
RANGE(*) |
DEFAULTステートメントの有効範囲内にあるすべての名前に適用されます。 |
DESCRIPTORS |
明示的な入り口宣言のパラメータ記述子リストで該当するパラメータ記述に含まれる属性に適用されます。少なくとも1つの属性が存在している必要があり、ヌル記述子には適用されません。RANGE()の位置にRANGE()の代わりに使用します。 |
attribute_specification |
|
ブロック内に複数のDEFAULTステートメントを指定することができます。
DEFAULTステートメントの適用範囲は、それが指定されているブロック、および、そのブロック内で、同じ範囲を持つ別のDEFAULTステートメントを含まず、かつ同じ範囲のDEFAULTステートメントを持つブロック内にも含まれていないすべてのブロックです。つまり、同じ範囲のDEFAULTステートメントが宣言されているブロックがあり、ブロック内にあるブロックでは、ブロック内で宣言された同じ範囲のDEFAULTステートメントの属性が先に適用されます。
内部ブロックでのDEFAULTステートメントは、明示的に宣言された名前に対してのみ有効です。これは、暗黙宣言の場合、その名前が使用されている外部プロシージャのPROCEDUREステートメントの直後に存在するDECLAREステートメントでその名前が宣言されているかのように宣言の範囲が決定されるからです。
以下に例を示します。
X: PROC; LABEL1: DEFAULT RANGE(AB) FLOAT; Y: BEGIN; LABEL2: DEFAULT RANGE(ABC) FIXED; END X;
LABEL1のDEFAULTステートメントの範囲は、プロシージャXとプロシージャ内に含まれている開始ブロックYです。LABEL1のDEFAULTステートメントで指定した範囲は、プロシージャXと開始ブロックYに宣言されている文字ABで始まるすべての名前です。ただし、開始ブロックYでは、文字ABCで始まる名前は除きます。
8. DEFINEステートメント
DEFINEステートメントは、PL/Iデータ・タイプの別名やリスト型データ・タイプを定義することができます。
8.1. DEFINE ALIASステートメント
DEFINE ALIASステートメントは、PL/Iデータ・タイプの別名を定義することができます。

項目 | 説明 |
---|---|
alias-name |
別名として使用する名前を指定します。 |
attributes |
別名のデータ属性を指定します。 |
以下は、DEFINE ALIASステートメントを使用して別名を定義し、別名の変数を宣言する例です。
DEFINE ALIAS NAME CHAR(32); DECLARE COMPANY_NAME TYPE NAME;
8.2. DEFINE ORDINALステートメント
DEFINE ORDINALステートメントは、順序付きの値のコレクションを表す(リスト型)データ・タイプを定義することができます。

ordinal-value-list :
項目 | 説明 |
---|---|
ordinal-name |
リスト型データ・タイプの名前を指定します。 |
member |
リスト型データ・タイプのメンバー名を指定します 。 |
VALUE |
メンバーの値を指定します。
|
PRECISION |
VALUEの精度を指定します。PRECISION属性を省略する場合、VALUE値を基準に決定されます。 |
SIGNED, UNSIGNED |
VALUEの符号の有無(負の値を取るかどうか)を指定します。 |
以下は、DEFINE ORDINALステートメントを使用して、順序付きの値のコレクションを表す(リスト型)データ・タイプを定義し、その変数を宣言する例です。
DEFINE ORDINAL LANG ( PLI, COBOL, ASSEMBLER, C, CPP ); DECLARE COMPILER ORDINAL LANG;
9. DELAYステートメント
DELAYステートメントは、指定された時間の間、プログラムの実行を一時中断します。

項目 | 説明 |
---|---|
expression |
中断する時間を定義します。指定時間の間、ミリ秒単位で中断します。 |
10. DELETEステートメント
DELETEステートメントは、データセットからレコードを削除します。

項目 | 説明 |
---|---|
FILE |
削除するファイルを指定します。対象ファイルはUPDATE属性を持つ必要があります。 |
KEY |
指定したキーに対応するレコードを削除します。 KEYオプションを使用するためには、ファイルはDIRECT属性あるいはSEQUENTIAL KEYED属性を持つ必要があります。 |
11. DISPLAYステートメント
DISPLAYステートメントは、メッセージを標準出力で(stdout)で出力します。

項目 | 説明 |
---|---|
expresson |
必要に応じて文字列に変換されます。この変換された文字列が出力されます。 GRAPHIC文字列は変換されません。 |
12. DOステートメント
DOステートメントは、複数のステートメントをグループにして、反復実行のための条件を定義することができます。DOステートメントとENDステートメントはペアになる必要があり、その中にあるステートメントはDOグループを形成します。
DOステートメントには、以下の4つのタイプがあります。
-
タイプ1
-
タイプ2
-
タイプ3
-
タイプ4
タイプ1
タイプ 1は、DOグループを定義してDOグループ内のステートメントを実行します。タイプ1は、繰り返して実行することはできません。

タイプ2とタイプ3
タイプ2とタイプ3は、DOグループを定義してDOグループ内のステートメントを実行します。繰り返して実行することができます。
タイプ 2 :

タイプ3 :

specification :
項目 | 説明 |
---|---|
WHILE(expression) |
DOグループが実行される前に式を計算してビット文字列に変換します。 結果のビット文字列のいずれかのビットが1であれば、そのDOグループは実行されます。すべてのビットがゼロであるか、文字列がNULLの場合、DOグループは実行されません。 specificationが複数回反復される場合は次のspecificationが実行されます。 |
UNTIL(expression) |
DOグループが実行された後に式を計算してビット文字列に変換します。 すべてのビットがゼロであるか、文字列がNULLの場合、DOグループが実行されます。いずれかのビットが1であれば、DOグループは実行されません。 specificationが複数回反復される場合は次のspecificationが実行されます。 |
reference |
DOグループを最初に実行する前に、expression1の値で初期化されます。 specificationが複数回反復される場合、各specificationのexpression1の値で初期化され、DOグループを実行します。 |
expression1 |
参照の初期値を定義します。 TO、BY、REPEATが省略された場合には、expression1の値を保持しつつ反復されます。 |
TO expression2 |
参照の終了値を定義します。参照の値がexpression1からexpression2の範囲を超える場合、そのDOグループは終了されます。 TO expression2が省略された場合には、WHILE、UNTILオプションによってDOグループが終了される必要があります。 |
BY expression |
参照の増減値を定義します。DOグループが実行された後、参照に加算される増分を示してから保存します。 TO expression2が定義されており、BY expressionが省略された場合には、デフォルト値としてBY 1が指定されます。 |
UPTHRU expression |
参照の終了値を定義します。DOグループが実行された後、参照に1を加算してから保存します。 TOオプションと異なる点は、TOオプションはDOグループを実行する前に比較しますが、UPTHRUオプションはDOグループを実行した後に比較するということです。したがって、UPTHRUオプションはDOグループを少なくとも一度以上実行します。 |
DOWNTHRU expression |
参照の終了値を定義します。DOグループが実行された後、参照に1を減算して保存します。 TOオプションと異なる点は、TOオプションはDOグループを実行する前に比較しますが、DOWNTHRUオプションはDOグループを実行した後に比較するということです。したがって、DOWNTHRUオプションはDOグループを少なくとも一度以上実行します。 |
REPEAT expression |
DOグループが実行された後、式を計算して参照に保存し、DOグループを再実行します。 WHILEまたはUNTILオプションによって終了される前まで、DOグループの実行を繰り返します。 |
タイプ4
タイプ4は、DOグループを定義してDOグループ内のステートメントを無限に繰り返します。

項目 | 説明 |
---|---|
FOREVER |
LOOPの同義語です。 |
LOOP |
無限の繰り返しを定義します。 繰り返しを終了するには、GOTOまたはLEAVEステートメントを使用するか、プロシージャあるいはプログラムを終了します。 |
13. ENDステートメント
ENDステートメントは、1つ以上のブロックまたはグループを終了させます。すべてのブロックやグループは、必ず1つのENDステートメントを持つ必要があります。

項目 | 説明 |
---|---|
statement-label |
ENDステートメントの前で記述された最も近くにあるDO、SELECT、PACKAGE、BEGINまたはPROCEDUREステートメントのラベル名を記述して、該当するブロックやグループの最後であることを示します。この項目が記述されていない場合は、最も近くにあるブロックまたはグループのいずれに最後であることを示します。 |
14. ENTRYステートメント
ENTRYステートメントを含むプロシージャは、すべての非ポインター・パラメータがBYADDR(pass by address)である必要があります。

項目 | 説明 |
---|---|
entry-label |
プロシージャの2次エントリ・ポイント名です。 |
parameter- list |
エントリ・ポイントのパラメータを記述します。 |
returns-options |
エントリ・ポイントのRETURN属性を定義します。 |
16. FETCHステートメント
FETCHステートメントは、プロシージャへのエントリ・ポイントがない場合、該当するプログラムを動的にロードします。

項目 | 説明 |
---|---|
entry-constant |
ロードされるプロシージャの名前を指定します。 |
17. FLUSHステートメント
FLUSHステートメントは、指定したファイルのバッファーをフラッシュします。FLUSHステートメントを使用するには、ファイルにBUFFERED属性が定義されている必要があります。

項目 | 説明 |
---|---|
FILE |
対象ファイルを指定します。アスタリスク(*)を使用して、開いているファイルをすべてフラッシュすることができます。 |
18. FORMATステートメント
FORMATステートメントは、編集ディレクティブI/Oで使用できるフォーマット・リストを指定することができます。

項目 | 説明 |
---|---|
label |
Rフォーマット項目で指定するラベルを定義します。詳細については、Rフォーマットを参照してください。 |
format list |
編集ディレクティブI/Oで使用するフォーマット・リストを定義します。 |
20. GETステートメント
GETステートメントは、ストリームからレコードを読み取ります。ストリームは、データセットのレコードまたは文字列から取得することができます。
データセットからデータを読み取る場合のGETステートメントの文法は以下のとおりです。

項目 | 説明 |
---|---|
FILE |
対象ファイルを指定します。ファイルを省略する場合、SYSINファイルが指定されます。 |
data-specification |
データ指定を参照してください。 |
COPY |
読み込んだストリームを指定したフィアルにそのまま保存します。ファイルを省略する場合、SYSPRINTファイルが指定されます。 |
SKIP (expression) |
式の値の分のデータをスキップして次のデータを取得します。 式が省略された場合、デフォルト値は1です。 |
文字列からデータを読み取る場合のGETステートメントの文法は以下のとおりです。

項目 | 説明 |
---|---|
STRING |
対象文字列を指定します。 |
data-specification |
データ指定を参照してください。 |
21. GOTOステートメント
GOTOステートメントは、ラベルが定義された場所にプログラムの制御を移します。

項目 | 説明 |
---|---|
label |
ラベルは、ラベル定数またはラベル変数になることができます。 ラベル変数の場合は、GOTOステートメントの実行時に保存された値を参照して移動します。 |
GOTOするターゲットは、同じブロック内のラベルであるか、外のブロックになることがあります。また、ONユニット内から外のブロックにGOTOすることができます。
以下のような状況ではGOTOを使用できません。
-
プロシージャ内からプロシージャ外へのGOTO
-
外のブロックまたは外のプロシージャからブロック内またはプロシージャ内へのGOTO
-
FORMATステートメントへのGOTO
22. IFステートメント
IFステートメントは条件を判別し、その結果に応じて分岐を行うことができます。

項目 | 説明 |
---|---|
expression |
真または偽を判別する式です。 「&」と「|」を使用して複数の条件を記述することができます。 |
unit |
条件に応じて実行されるステートメントを記述します。 ユニットは、1つのステートメント、DOグループまたは開始ブロックになることができます。 条件が真の場合はTHENに記述されたユニットが実行されます。偽の場合はELSEに記述されたユニットが実行されるか、ELSEがない場合にはIFステートメントが終了されます。 |
23. ITERATEステートメント
ITERATEステートメントは、実行中のDOグループをスキップして、次の反復条件のDOグループを実行します。
ITERATEステートメントは、必ずDOグループ内で使用される必要があります。

項目 | 説明 |
---|---|
label-constant |
ラベルは、DOステートメントのラベルでなければなりません。ラベルを省略した場合は、ITERATEステートメントを含む最も近くにあるDOグループをスキップします。 |
24. LEAVEステートメント
LEAVEステートメントは、実行中のDOグループから制御を離します。LEAVEステートメントは、グループ内で使用される必要があります。

項目 | 説明 |
---|---|
label-constant |
ラベルは、DOステートメントのラベルでなければなりません。ラベルが省略されると、LEAVEステートメントを含む最も近くにあるDOグループを終了します。 |
25. LOCATEステートメント
LOCATEステートメントは、次に記録する出力バッファーに基底付き変数を介してアクセスできるように、その位置をポインターで指定します。

項目 | 説明 |
---|---|
FILE |
ターゲット・ファイルを指定します。ターゲット・ファイルはOUTPUT SEQUENTIAL BUFFERED属性を持つ必要があります |
based variable |
出力バッファーにアクセスできる基底付き変数を定義します。 |
SET |
出力バッファーのアドレスを保存するポインターを指定します。 |
KEYFROM |
記録するレコードのキーを指定します。 KEYFROMオプションを使用するためには、ファイルはKEYED属性を持つ必要があります。 KEYFROMの値は、索引付きデータセットでは文字に変換され、相対データセットでは固定10進数に変換されます。 |
レコードは、LOCATEステートメントを実行した時点では記録されず、FLUSHステートメントを使用してバッファーを空にした際か、次のLOCATEステートメントを実行した際に記録されます。したがって、LOCATEステートメントを実行しても、データセットに記録されるレコードは基底付き変数を介して継続して変更されることがあります。 |
27. ONステートメント
ONステートメントは、条件が発生した際に、指定したONユニットを実行するようにONユニットを登録します。

項目 | 説明 |
---|---|
condition |
1つ以上の条件を指定します。条件については、条件タイプを参照してください。 |
SNAP |
サポートしていません。 |
SYSTEM |
条件が発生した際に、基本動作を実行するように指定します。基本動作の詳細については、条件タイプを参照してください。 |
ON-unit |
条件が発生した際に実行されるステートメントを記述します。 単一のステートメントまたは開始ブロックのいずれかを指定できます。 ONユニットは、ONステートメントが実行される時点ではなく、条件が発生した際に実行されます。 |
登録した条件の発生条件を満たした場合にONユニットが実行されます。同じ条件を複数回登録すると、最後に登録されたONステートメントのONユニットが実行されます。 ONステートメントに登録した条件は、ONステートメントが含まれているブロックあるいはプロシージャが終了する際に解除されます。また、REVERTステートメントを使用してユーザーが直接解除することもできます。
以下は、ZERODIVIDE条件を登録する例です。
ON ZERODIVIDE BEGIN; DISPLAY('ZERODIVIDE condition raised'); END; A = B / 0;
ZERODIVIDE条件は、ゼロで割る際に発生する条件です。「A = B / 0」によってZERODIVIDE条件が起こると、ONステートメントに登録したONユニットが実行され、DISPLAY文が実行されます。
28. OPENステートメント
OPENステートメントは、指定したファイルを開きます。

open-options :
項目 | 説明 |
---|---|
FILE |
対象ファイルを指定します。 |
FILE属性 |
詳細については、「ファイル」を参照してください。 |
TITLE |
JCLに記述されている外部データセットのDD名を指定します。 |
LINESIZE |
1行の長さを定義します。 ストリームがLINESIZEに指定した値を超えた場合、次の行の最初の列に移動します。 LINESIZEオプションは、STREAM OUTPUTファイルにのみ使用できます。(デフォルト値: 120) |
PAGESIZE |
1ページあたりの行数を定義します。 行のサイズがPAGESIZEに指定した値を超えた場合、ENDFILE条件が起こります。 PUTステートメントでPAGEフォーマット項目やPAGEオプションを使って、新しいページを開始することができます。(デフォルト値: 60) |
ファイルを開くためには、OPENステートメントを指定するか、ファイルが開いていない状態でREAD、WRITE、REWRITE、DELETE、LOCATE、PUT、GETステートメントを使用すると、ファイルが開きます。OPENステートメントを使ってファイルを明示的に開く場合に、FILE属性を定義して宣言すると、FILE属性を再定義することができます。
以下は、OPENステートメントを使用してFILE属性を再定義する例です。
DECLARE TEST FILE RECORD OUTPUT; OPEN FILE(TEST) STREAM INPUT; CLOSE FILE(TEST); OPEN FILE(TEST);
最初のOPENステートメントで、TESTはSTREAM、INPUT属性を持ちます。ファイルを閉じると、再度開く際に適用したFILE属性は消去されます。したがって、2つ目のOPENステートメントでは、DECLAREステートメントで指定したRECORD、OUTPUT属性を持ちます。
宣言時に定義したFILE属性と、開く際に定義したFILE属性が衝突した場合、エラーが発生します。 |
29. OTHERWISEステートメント
OTHERWISEステートメントの詳細については、SELECTステートメントを参照してください。
31. PUTステートメント
PUTステートメントは、レコードをストリームに作成します。ストリームは、データセットのレコード、または文字列に保存されます。
データセットにデータを保存する場合のPUTステートメントの文法は以下のとおりです。

項目 | 説明 |
---|---|
FILE |
対象ファイルを指定します。ファイルを省略する場合、SYSPRINTファイルが指定されます。 |
data-specification |
データ指定を参照してください。 |
SKIP (expression) |
式の値の分の行をスキップします。式が省略された場合、デフォルト値は1です。 |
LINE (expression) |
式の値に対応する行に移動します。 LINEオプションを使用するためには、ファイルにPRINT属性が定義されている必要があります。 |
PAGE |
新しいページを開始します。行は1に初期化されます。 PAGEオプションを使用するためには、ファイルにPRINT属性が定義されている必要があります。 |
文字列にデータを保存する場合のPUTステートメントの文法は以下のとおりです。

項目 | 説明 |
---|---|
STRING |
対象文字列を指定します |
data-specification |
データ指定を参照してください。 |
32. READステートメント
READステートメントは、データセットからレコードを読み取ります。読み取ったレコードを、指定した変数に保存したり、ポインターで指定することができます。

項目 | 説明 |
---|---|
FILE |
読み取るファイルを指定します。対象ファイルはINPUT属性またはUPDATE属性を持つ必要があります。 |
IGNORE |
式の値の分のレコードを無視します。 計算された式の値がnの場合、IGNOREオプションを実行した後にはn+1番目のレコードを読み取ります。 |
INTO |
読み取ったレコードを指定した変数に保存します。 変数が配列または構造体の場合、必ずストレージで隣接している必要があります。 |
SET |
読み取ったレコードを指定したポインターでセットします。 |
KEY |
指定したキーに対応するレコードを読み取ります。 KEYオプションを使用するためには、ファイルはDIRECT属性またはSEQUENTIAL KEYED属性を持つ必要があります。 |
KEYTO |
レコードを読み取る際にそのレコードのキー値も一緒に読み取ります。 KEYTOオプションを使用するためには、ファイルはSEQUENTIAL KEYED属性を持つ必要があります。 |
33. RETURNステートメント
RETURN ステートメントは、プロシージャの実行を終了します。プログラムの制御は、呼び出し参照の直後の場所に戻されます。

-
式を伴うRETURNステートメントを、OPTIONS(MAIN)によるプロシージャ内で使用することはできません。
-
式を伴わないRETURNステートメントは、RETURNSオプションを指定したプロシージャ内で使用することはできません。
-
RETURNSオプションを指定したプロシージャでは、少なくとも1つ以上のRETURNステートメントが含まれている必要があります。
34. REVERTステートメント
REVERTステートメントは、ONステートメントを使用して登録したONユニットを取り消します。

項目 | 説明 |
---|---|
condition |
1つ以上の条件を指定します。条件については、条件タイプを参照してください。 |
REVERTステートメントは、現在のブロックあるいはプロシージャに登録されているONユニットを取り消します。現在のブロックあるいはプロシージャに登録されているONユニットがない場合、REVERTステートメントは実行されません。上位ブロックあるいはプロシージャで登録したONユニットは取り消すことができません。
以下は、REVERTステートメントを使用して、登録したONユニットを取り消す例です。
ON ZERODIVIDE BEGIN; DISPLAY('ZERODIVIDE condition raised'); END; REVERT ZERODIVIDE; A = B / 0;
「A = B / 0;」によってZERODIVIDE条件が起こっても、ONステートメントに登録したONユニットがREVERTステートメントによって取り消されたため、そのONユニットは実行されません。現在登録されているONユニットがない場合、条件の特性によってデフォルトの処置を取ります。ここでは、ERROR条件を発生させるか、プログラムの実行を続行します。ZERODIVIDE条件は、デフォルトの処置としてERROR条件を発生させます。
35. REWRITEステートメント
REWRITEステートメントは、データセットのレコードを更新します。

項目 | 説明 |
---|---|
FILE |
更新するファイルを指定します。対象ファイルはUPDATE属性を持つ必要があります。 |
FROM |
レコードを記録する変数を指定します。変数が配列あるいは構造体の場合、ストレージで隣接している必要があります。 |
KEY |
指定したキーに対応するレコードを削除します。 KEYオプションを使用するためには、ファイルはDIRECT属性あるいはSEQUENTIAL KEYED属性を持つ必要があります。 |
36. SELECTステートメント
SELECTステートメントは条件を判別して、その結果に応じて複数分岐を行うことができます。
SELECTステートメントは1つ以上のWHENステートメントと、ゼロまたは1個のOTHERWISEステートメントを含むことができます。また、SELECTステートメントはENDステートメントとペアになる必要があります。

項目 | 説明 |
---|---|
SELECT (expression) |
SELECTの次の式は計算されて保存されます。 |
WHEN (expression) unit |
WHENの次には、1つの式を記述したり、「&」と「|」を使用して複数の式を記述することが可能であり、各式は計算されてSELECTステートメントの式と比較されます。 WHENステートメントの式のいずれかがSELECTステートメントの式と同じである場合、そのユニットが実行されます。 |
OTHERWISE unit |
SELECTの次の式がすべてのWHENステートメントの式と一致しない場合、OTHERWISEステートメントが実行されます。 OTHERWISEステートメントが存在しないと、SELECTステートメントは終了されます。 |
unit |
WHENまたはOTHERWISEステートメントの条件を満たしている場合に実行されるステートメントを記述します。 ユニットは、1つのステートメント、DOグループ、または開始ブロックになることができます。 |
37. SIGNALステートメント
SIGNALステートメントは、ユーザーが直接ONユニットを実行するように条件を引き起こします。

項目 | 説明 |
---|---|
condition |
条件を指定します。条件については、条件タイプを参照してください。 |
ユーザーが登録したONユニットが存在する場合は、そのONユニットを実行し、ユーザーが指定したONユニットが存在しない場合は、内部的に指定されたデフォルトの処置を行います。
以下は、SIGNALステートメントを使用して、ユーザーが直接ONユニットを実行させる例です。
ON ZERODIVIDE BEGIN; DISPLAY('ZERODIVIDE condition raised'); END; SIGNAL ZERODIVIDE;
SIGNALステートメントによってZERODIVIDE条件のONユニットが実行されます。入出力に関連する条件は、その条件が発生しても、ファイルが異なる場合はONユニットは実行されません。
39. WHENステートメント
WHENステートメントの詳細については、SELECTステートメントを参照してください。
40. WRITEステートメント
WRITEステートメントは、データセットにレコードを書き込みます。

項目 | 説明 |
---|---|
FILE |
記録するファイルを指定します。対象ファイルはOUTPUT属性またはUPDATE属性を持つ必要があります。 |
FROM |
レコードを記録する変数を指定します。変数が配列あるいは構造体の場合、ストレージで隣接している必要があります。 |
KEYFROM |
記録するレコードのキーを指定します。 KEYFROMオプションを使用するためには、ファイルはKEYED属性を持つ必要があります。 KEYFROMの値は、索引付きデータセットでは文字に変換され、相対データセットでは固定10進数に変換されます。 |
KEYTO |
レコードを記録する際に次に記録されるキーの値を保存します。 KEYTOオプションを使用するためには、ファイルはSEQUENTIAL KEYED属性を持つ必要があります。 |