ステートメント

本章では、OpenFrame PL/Iのステートメントの使用方法について説明します。

1. ALLOCATEステートメント(略語: ALLOC)

ALLOCATEステートメントは、被制御変数または基底付き変数のストレージを割り当てます。

1.1. 被制御変数のALLOCATEステートメント

ALLOCATEステートメントは、被制御変数にストレージを割り当てます。同時に被制御パラメータも割り当てることができます。ALLOCATEステートメントに被制御変数の配列の境界、文字列の長さを指定することができます。

figure syntax allocate controlled

配列の境界、文字列の長さは、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);

1.2. 基底付き変数のALLOCATEステートメント

ALLOCATEステートメントは基底付き変数のストレージを割り当て、ロケーター変数にストレージ・アドレスを保存します。

figure syntax allocate based

割り当てられるストレージのサイズは、基底付き変数の属性とALLOCATEステートメントの実行時に決定されるサイズ、文字列長によって決まります。

2. ASSIGNステートメント

代入ステートメントは、式を計算し、その結果を複数のターゲット変数に割り当てます。このとき、ターゲット変数または疑似変数の属性がソースの属性と異なる場合があるので、データ変換が必要になる場合があります。

figure syntax assignment
項目 説明

reference

ターゲット変数または疑似変数を記述します。

expression

ソースの式です。

BY NAME

構造体割り当てに使用されるオプションです。詳細については、割り当ての実行を参照してください。

複合代入ステートメント

複合代入ステートメントは、複合代入演算子を使用して割り当てを行います。

figure syntax assignment compound
項目 説明

reference

ターゲット変数または疑似変数を記述します。

compound operator

割り当てが行われる前に、ソースとターゲットに適用する演算子を記述します。

複合代入ステートメントに使用可能な複合代入演算子は以下のとおりです。

  • += : 加算後に代入

  • -= : 減算後に代入

  • *= : 乗算後に代入

  • /= : 除算後に代入

  • **= : 累乗演算後に代入

  • ||= : 連結演算後に代入

  • |= : OR演算後に代入

  • &= : AND演算後に代入

  • ^= または <> : XOR(排他的論理和)演算後に代入

expression

ソースの式です。

以下は、複合代入ステートメントの実行例です。

 X += 5;      ==> X = X + 5;
 X *= Y - 1;  ==> X = X * (Y - 1);
ターゲット変数

ターゲット変数は、要素変数、配列変数、構造体変数または疑似変数にすることができます。

  • 配列ターゲット

    • ターゲットは、スカラーまたは構造体の配列である必要があります。ソースは、スカラー式であるか、そのターゲットと同じ次元数と境界を持つ式でなければなりません。

  • 構造体ターゲット

    • BY NAMEが記述されている場合、各ターゲットは構造体である必要があり、ソースも構造体でなければなりません。

    • BY NAMEが記述されていない場合、各ターゲットは構造体であり、ソースはスカラーまたはターゲットと同じ構造の構造体でなければなりません。

    • BY NAMEが記述されていない場合、ソースをNULL文字列("")にすると、以下のように処理されます。

      1. すべてのターゲットは、'00’Xで埋められます。

      2. すべての数値ターゲットは0に設定されます。

      3. すべての文字およびグラフィック・ターゲットは空白で埋められます。

割り当ての実行
  • 配列割り当て

    • すべての配列演算子(ソースとターゲット)は、同じ次元数と境界を持つ必要があります。

    • 配列の割り当ては、以下のようにループに展開されます。

       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が記述されている場合、以下のように処理されます。

      1. ターゲット構造体の最初から、メンバー名と同じ名前をソース・メンバーから検索します。このときメンバーは、構造体のすぐ下のレベル(チャイルド)のみを探します。チャイルドのチャイルドは検索しません。

      2. 見つからなかった場合は、2番目のメンバー、3番目のメンバーなど、見つかるまで繰り返します。

      3. 見つかったメンバーが構造体または構造体の配列の割り当てである場合は、BY NAMEオプションが付けられます。

      4. 見つかったメンバーがスカラーまたはスカラーの配列の場合は、エレメント割り当てを実行します。

      5. 他のメンバーに上記の操作を同様に適用します。

    • 以下は、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;

3. BEGINステートメント

BEGINステートメントは、1つ以上のブロックの開始を意味します。

figure syntax begin

4. CALLステートメント

CALLステートメントは、サブルーチンを呼び出します。

figure syntax call
項目 説明

entry-reference

呼び出されるサブルーチンの名前を指定します。

generic-name

GENERIC属性で宣言される変数名を指定します。

built-in name

組み込み関数の名前を指定します。

argument

呼び出されるサブルーチンに渡されるデータ項目を指定します。

5. CLOSEステートメント

CLOSEステートメントは、指定したファイルを閉じます。

figure syntax close
項目 説明

FILE

対象ファイルを指定します。アスタリスク(*)を使用して、開いているファイルをすべて閉じることができます。

6. DECLAREステートメント

DECLAREステートメントは、データ項目の名前と一部またはすべての属性を記述することができます。明示的に属性が記述されず、コンテキストによって判別できない場合は、デフォルト属性が適用されます。

figure syntax declare
項目 説明

*

スカラー、レベル1データの名前として記述することはできません。

attributes

宣言されるデータの属性を記述します。任意の順序で記述できます。詳細については、 データ・タイプと属性を 参照してください。

level

ゼロ以外の整数である必要があります。スカラー、配列データを宣言するときは記述する必要はなく、レベル1になります。

name

宣言されるデータの名前を記述します。レベル1の名前は、同じブロック内で一意である必要があります。

条件接頭語とレベルは、DECLAREステートメント上には記述できません。

7. DEFAULTステートメント(略語: DFT)

DEFAULTステートメントは、属性セットが完全ではない場合にデータ属性のデフォルトを定義します。

暗黙宣言とコンテキスト宣言または部分的に完全な明示宣言の場合、DEFAULTステートメントが適用されない属性については、言語に固有のデフォルトが適用されます。

DEFAULTステートメントはENTRY属性またはFILE属性で宣言された名前を除いて、すべての別の属性を再定義します。ただし、VARIABLEを暗示する属性のない名前は、DEFAULTステートメントが適用される前にPL/Iによって暗黙的にCONSTANT属性が提供されます。構造体と共用体のエレメントには、修飾されたエレメントの名前ではなく、エレメントの名前に応じてデフォルト属性が適用されます。

figure default stmt1

identifier:

image

項目 説明

RANGE(identifier)

同じ文字で始まる名前に適用されます。

RANGE(identifier : identifier)

2つのIDで指定された文字で始まる名前またはアルファベット順で2つのIDの中間にある名前に適用されます。

RANGE(*)

DEFAULTステートメントの有効範囲内にあるすべての名前に適用されます。

DESCRIPTORS

明示的な入り口宣言のパラメータ記述子リストで該当するパラメータ記述に含まれる属性に適用されます。少なくとも1つの属性が存在している必要があり、ヌル記述子には適用されません。RANGE()の位置にRANGE()の代わりに使用します。

attribute_specification

  • attribute-list

    データ項目の宣言を完成させるためだけに必要な属性です。FILEを使用した場合は、VARIABLEとINTERNAL属性が指定できます。次元属性は、属性指定の最初の項目で定義できます。境界は算術定数または式として指定可能であり、REFERオプションを含むことができます。次元属性は、明示的に宣言された名前にだけデフォルト値を適用することができます。INITIAL属性も適用できます。

  • VALUE

    attribute_specificationに含まれるVALUE属性は、次元属性の前を除いて、attribute_specificationの中のどこにでも書くことができます。

    VALUEは、区域のサイズ、文字列の長さ、数値精度に関するデフォルトの規則を定義します。VALUE句の中のサイズ、長さ、精度は、システム・デフォルト属性の適用後ではなく、デフォルトが適用される前に適用されます。

    以下に例を示します。

    DEFAULT RANGE(I) VALUE(FIXED DECIMAL(7,3));
    I = 2;

    明示的に宣言されていない場合、Iには、言語で定められるデフォルトの属性FIXED BINARY(15,0)が与えられます。上記のDEFAULTステートメントは、FIXED DECIMAL属性を持つ名前に対してデフォルト精度を(7,3)に指定しただけなので、IはDEFAULTステートメントから影響を受けません。

ブロック内に複数の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データ・タイプの別名を定義することができます。

figure syntax define alias
項目 説明

alias-name

別名として使用する名前を指定します。

attributes

別名のデータ属性を指定します。

以下は、DEFINE ALIASステートメントを使用して別名を定義し、別名の変数を宣言する例です。

  DEFINE ALIAS NAME CHAR(32);
  DECLARE COMPANY_NAME TYPE NAME;

8.2. DEFINE ORDINALステートメント

DEFINE ORDINALステートメントは、順序付きの値のコレクションを表す(リスト型)データ・タイプを定義することができます。

figure syntax define ordinal

ordinal-value-list :

image

項目 説明

ordinal-name

リスト型データ・タイプの名前を指定します。

member

リスト型データ・タイプのメンバー名を指定します 。

VALUE

メンバーの値を指定します。

  • VALUE属性を指定する場合、integer値は前のメンバーの値より大きい必要があります。

  • VALUE属性を指定しない場合、最初のメンバーの値は0になり、最初のメンバーでないメンバーの値は「前のメンバーの値 + 1」になります。

PRECISION

VALUEの精度を指定します。PRECISION属性を省略する場合、VALUE値を基準に決定されます。

SIGNED, UNSIGNED

VALUEの符号の有無(負の値を取るかどうか)を指定します。

以下は、DEFINE ORDINALステートメントを使用して、順序付きの値のコレクションを表す(リスト型)データ・タイプを定義し、その変数を宣言する例です。

  DEFINE ORDINAL LANG ( PLI, COBOL, ASSEMBLER, C, CPP );
  DECLARE COMPILER ORDINAL LANG;

9. DELAYステートメント

DELAYステートメントは、指定された時間の間、プログラムの実行を一時中断します。

figure syntax delay
項目 説明

expression

中断する時間を定義します。指定時間の間、ミリ秒単位で中断します。

10. DELETEステートメント

DELETEステートメントは、データセットからレコードを削除します。

figure syntax delete
項目 説明

FILE

削除するファイルを指定します。対象ファイルはUPDATE属性を持つ必要があります。

KEY

指定したキーに対応するレコードを削除します。

KEYオプションを使用するためには、ファイルはDIRECT属性あるいはSEQUENTIAL KEYED属性を持つ必要があります。

11. DISPLAYステートメント

DISPLAYステートメントは、メッセージを標準出力で(stdout)で出力します。

figure syntax display
項目 説明

expresson

必要に応じて文字列に変換されます。この変換された文字列が出力されます。

GRAPHIC文字列は変換されません。

12. DOステートメント

DOステートメントは、複数のステートメントをグループにして、反復実行のための条件を定義することができます。DOステートメントとENDステートメントはペアになる必要があり、その中にあるステートメントはDOグループを形成します。

DOステートメントには、以下の4つのタイプがあります。

  • タイプ1

  • タイプ2

  • タイプ3

  • タイプ4

タイプ1

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

figure syntax do type1
タイプ2とタイプ3

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

タイプ 2 :

figure syntax do type2

タイプ3 :

figure syntax do type3

specification :

image

項目 説明

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グループ内のステートメントを無限に繰り返します。

figure syntax do type4
項目 説明

FOREVER

LOOPの同義語です。

LOOP

無限の繰り返しを定義します。

繰り返しを終了するには、GOTOまたはLEAVEステートメントを使用するか、プロシージャあるいはプログラムを終了します。

13. ENDステートメント

ENDステートメントは、1つ以上のブロックまたはグループを終了させます。すべてのブロックやグループは、必ず1つのENDステートメントを持つ必要があります。

figure syntax end
項目 説明

statement-label

ENDステートメントの前で記述された最も近くにあるDO、SELECT、PACKAGE、BEGINまたはPROCEDUREステートメントのラベル名を記述して、該当するブロックやグループの最後であることを示します。この項目が記述されていない場合は、最も近くにあるブロックまたはグループのいずれに最後であることを示します。

14. ENTRYステートメント

ENTRYステートメントを含むプロシージャは、すべての非ポインター・パラメータがBYADDR(pass by address)である必要があります。

figure syntax entry
項目 説明

entry-label

プロシージャの2次エントリ・ポイント名です。

parameter- list

エントリ・ポイントのパラメータを記述します。

returns-options

エントリ・ポイントのRETURN属性を定義します。

15. EXITステートメント

EXITステートメントは、現行のPL/Iプログラムを終了します。OpenFrame PL/IではSTOPステートメントと同じ処理をします。

figure syntax exit

16. FETCHステートメント

FETCHステートメントは、プロシージャへのエントリ・ポイントがない場合、該当するプログラムを動的にロードします。

figure syntax fetch
項目 説明

entry-constant

ロードされるプロシージャの名前を指定します。

17. FLUSHステートメント

FLUSHステートメントは、指定したファイルのバッファーをフラッシュします。FLUSHステートメントを使用するには、ファイルにBUFFERED属性が定義されている必要があります。

figure syntax flush
項目 説明

FILE

対象ファイルを指定します。アスタリスク(*)を使用して、開いているファイルをすべてフラッシュすることができます。

18. FORMATステートメント

FORMATステートメントは、編集ディレクティブI/Oで使用できるフォーマット・リストを指定することができます。

figure syntax format
項目 説明

label

Rフォーマット項目で指定するラベルを定義します。詳細については、Rフォーマットを参照してください。

format list

編集ディレクティブI/Oで使用するフォーマット・リストを定義します。

19. FREEステートメント

FREEステートメントは、被制御変数または基底付き変数に割り当てられたストレージを解放します。

19.1. 被制御変数のFREEステートメント

被制御変数に割り当てられているストレージを解放します。

figure syntax free controlled

19.2. 基底付き変数のFREEステートメント

基底付き変数に割り当てられているストレージを解放します。

figure syntax free based

20. GETステートメント

GETステートメントは、ストリームからレコードを読み取ります。ストリームは、データセットのレコードまたは文字列から取得することができます。

データセットからデータを読み取る場合のGETステートメントの文法は以下のとおりです。

figure syntax get file
項目 説明

FILE

対象ファイルを指定します。ファイルを省略する場合、SYSINファイルが指定されます。

data-specification

データ指定を参照してください。

COPY

読み込んだストリームを指定したフィアルにそのまま保存します。ファイルを省略する場合、SYSPRINTファイルが指定されます。

SKIP (expression)

式の値の分のデータをスキップして次のデータを取得します。

式が省略された場合、デフォルト値は1です。

文字列からデータを読み取る場合のGETステートメントの文法は以下のとおりです。

figure syntax get string
項目 説明

STRING

対象文字列を指定します。

data-specification

データ指定を参照してください。

21. GOTOステートメント

GOTOステートメントは、ラベルが定義された場所にプログラムの制御を移します。

figure syntax goto
項目 説明

label

ラベルは、ラベル定数またはラベル変数になることができます。

ラベル変数の場合は、GOTOステートメントの実行時に保存された値を参照して移動します。

GOTOするターゲットは、同じブロック内のラベルであるか、外のブロックになることがあります。また、ONユニット内から外のブロックにGOTOすることができます。

以下のような状況ではGOTOを使用できません。

  • プロシージャ内からプロシージャ外へのGOTO

  • 外のブロックまたは外のプロシージャからブロック内またはプロシージャ内へのGOTO

  • FORMATステートメントへのGOTO

22. IFステートメント

IFステートメントは条件を判別し、その結果に応じて分岐を行うことができます。

figure syntax if
項目 説明

expression

真または偽を判別する式です。

「&」と「|」を使用して複数の条件を記述することができます。

unit

条件に応じて実行されるステートメントを記述します。

ユニットは、1つのステートメント、DOグループまたは開始ブロックになることができます。

条件が真の場合はTHENに記述されたユニットが実行されます。偽の場合はELSEに記述されたユニットが実行されるか、ELSEがない場合にはIFステートメントが終了されます。

23. ITERATEステートメント

ITERATEステートメントは、実行中のDOグループをスキップして、次の反復条件のDOグループを実行します。

ITERATEステートメントは、必ずDOグループ内で使用される必要があります。

figure syntax iterate
項目 説明

label-constant

ラベルは、DOステートメントのラベルでなければなりません。ラベルを省略した場合は、ITERATEステートメントを含む最も近くにあるDOグループをスキップします。

24. LEAVEステートメント

LEAVEステートメントは、実行中のDOグループから制御を離します。LEAVEステートメントは、グループ内で使用される必要があります。

figure syntax leave
項目 説明

label-constant

ラベルは、DOステートメントのラベルでなければなりません。ラベルが省略されると、LEAVEステートメントを含む最も近くにあるDOグループを終了します。

25. LOCATEステートメント

LOCATEステートメントは、次に記録する出力バッファーに基底付き変数を介してアクセスできるように、その位置をポインターで指定します。

figure syntax locate
項目 説明

FILE

ターゲット・ファイルを指定します。ターゲット・ファイルはOUTPUT SEQUENTIAL BUFFERED属性を持つ必要があります

based variable

出力バッファーにアクセスできる基底付き変数を定義します。

SET

出力バッファーのアドレスを保存するポインターを指定します。

KEYFROM

記録するレコードのキーを指定します。

KEYFROMオプションを使用するためには、ファイルはKEYED属性を持つ必要があります。

KEYFROMの値は、索引付きデータセットでは文字に変換され、相対データセットでは固定10進数に変換されます。

レコードは、LOCATEステートメントを実行した時点では記録されず、FLUSHステートメントを使用してバッファーを空にした際か、次のLOCATEステートメントを実行した際に記録されます。したがって、LOCATEステートメントを実行しても、データセットに記録されるレコードは基底付き変数を介して継続して変更されることがあります。

26. NULLステートメント

NULLステートメントは、何も行いません。通常、THEN、ELSE、WHEN、OTHERに記述して実行する場合、その条件では何にも行わないために使用されます。

figure syntax null

27. ONステートメント

ONステートメントは、条件が発生した際に、指定したONユニットを実行するようにONユニットを登録します。

figure syntax 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ステートメントは、指定したファイルを開きます。

figure syntax open

open-options :

image

項目 説明

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ステートメントを参照してください。

30. PACKAGEステートメント

PACKAGEステートメントは、変数の宣言、DEFAULTステートメント、プロシージャ・ブロックだけを含むことができます。現在のOpenFrame PL/Iは、プロシージャ・ブロックのみを含むことが可能であり、PACKAGEステートメントのオプションはサポートしていません。

figure syntax package
項目 説明

condition_prefix

PACKAGEステートメントに記述された条件接頭語(Condition prefix)は、パッケージ内のすべてのプロシージャに適用されます。詳細については、条件条件接頭語を参照してください。

package_name

パッケージ名を記述します。

31. PUTステートメント

PUTステートメントは、レコードをストリームに作成します。ストリームは、データセットのレコード、または文字列に保存されます。

データセットにデータを保存する場合のPUTステートメントの文法は以下のとおりです。

figure syntax put file
項目 説明

FILE

対象ファイルを指定します。ファイルを省略する場合、SYSPRINTファイルが指定されます。

data-specification

データ指定を参照してください。

SKIP (expression)

式の値の分の行をスキップします。式が省略された場合、デフォルト値は1です。

LINE (expression)

式の値に対応する行に移動します。

LINEオプションを使用するためには、ファイルにPRINT属性が定義されている必要があります。

PAGE

新しいページを開始します。行は1に初期化されます。

PAGEオプションを使用するためには、ファイルにPRINT属性が定義されている必要があります。

文字列にデータを保存する場合のPUTステートメントの文法は以下のとおりです。

figure syntax put string
項目 説明

STRING

対象文字列を指定します

data-specification

データ指定を参照してください。

32. READステートメント

READステートメントは、データセットからレコードを読み取ります。読み取ったレコードを、指定した変数に保存したり、ポインターで指定することができます。

figure syntax read
項目 説明

FILE

読み取るファイルを指定します。対象ファイルはINPUT属性またはUPDATE属性を持つ必要があります。

IGNORE

式の値の分のレコードを無視します。

計算された式の値がnの場合、IGNOREオプションを実行した後にはn+1番目のレコードを読み取ります。

INTO

読み取ったレコードを指定した変数に保存します。

変数が配列または構造体の場合、必ずストレージで隣接している必要があります。

SET

読み取ったレコードを指定したポインターでセットします。

KEY

指定したキーに対応するレコードを読み取ります。

KEYオプションを使用するためには、ファイルはDIRECT属性またはSEQUENTIAL KEYED属性を持つ必要があります。

KEYTO

レコードを読み取る際にそのレコードのキー値も一緒に読み取ります。

KEYTOオプションを使用するためには、ファイルはSEQUENTIAL KEYED属性を持つ必要があります。

33. RETURNステートメント

RETURN ステートメントは、プロシージャの実行を終了します。プログラムの制御は、呼び出し参照の直後の場所に戻されます。

figure syntax return
  • 式を伴うRETURNステートメントを、OPTIONS(MAIN)によるプロシージャ内で使用することはできません。

  • 式を伴わないRETURNステートメントは、RETURNSオプションを指定したプロシージャ内で使用することはできません。

  • RETURNSオプションを指定したプロシージャでは、少なくとも1つ以上のRETURNステートメントが含まれている必要があります。

34. REVERTステートメント

REVERTステートメントは、ONステートメントを使用して登録したONユニットを取り消します。

figure syntax revert
項目 説明

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ステートメントは、データセットのレコードを更新します。

figure syntax rewrite
項目 説明

FILE

更新するファイルを指定します。対象ファイルはUPDATE属性を持つ必要があります。

FROM

レコードを記録する変数を指定します。変数が配列あるいは構造体の場合、ストレージで隣接している必要があります。

KEY

指定したキーに対応するレコードを削除します。

KEYオプションを使用するためには、ファイルはDIRECT属性あるいはSEQUENTIAL KEYED属性を持つ必要があります。

36. SELECTステートメント

SELECTステートメントは条件を判別して、その結果に応じて複数分岐を行うことができます。

SELECTステートメントは1つ以上のWHENステートメントと、ゼロまたは1個のOTHERWISEステートメントを含むことができます。また、SELECTステートメントはENDステートメントとペアになる必要があります。

figure syntax select
項目 説明

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ユニットを実行するように条件を引き起こします。

figure syntax signal
項目 説明

condition

条件を指定します。条件については、条件タイプを参照してください。

ユーザーが登録したONユニットが存在する場合は、そのONユニットを実行し、ユーザーが指定したONユニットが存在しない場合は、内部的に指定されたデフォルトの処置を行います。

以下は、SIGNALステートメントを使用して、ユーザーが直接ONユニットを実行させる例です。

 ON ZERODIVIDE
 BEGIN;
 DISPLAY('ZERODIVIDE condition raised');
 END;

 SIGNAL ZERODIVIDE;

SIGNALステートメントによってZERODIVIDE条件のONユニットが実行されます。入出力に関連する条件は、その条件が発生しても、ファイルが異なる場合はONユニットは実行されません。

38. STOPステートメント

STOPステートメントは、現行のPL/Iプログラムを終了します。OpenFrame PL/IではEXITステートメントと同じ処理を行います。

figure syntax stop

39. WHENステートメント

WHENステートメントの詳細については、SELECTステートメントを参照してください。

40. WRITEステートメント

WRITEステートメントは、データセットにレコードを書き込みます。

figure syntax write
項目 説明

FILE

記録するファイルを指定します。対象ファイルはOUTPUT属性またはUPDATE属性を持つ必要があります。

FROM

レコードを記録する変数を指定します。変数が配列あるいは構造体の場合、ストレージで隣接している必要があります。

KEYFROM

記録するレコードのキーを指定します。

KEYFROMオプションを使用するためには、ファイルはKEYED属性を持つ必要があります。

KEYFROMの値は、索引付きデータセットでは文字に変換され、相対データセットでは固定10進数に変換されます。

KEYTO

レコードを記録する際に次に記録されるキーの値を保存します。

KEYTOオプションを使用するためには、ファイルはSEQUENTIAL KEYED属性を持つ必要があります。