Rational Developer for System z
Enterprise PL/I for z/OS, Version 3.8, プログラミング・ガイド

ストリーム入出力によるデータ・セットへのアクセス

ストリーム指向データ伝送を使ってアクセスするデータ・セットは、 ストリーム指向データ伝送で作成されたものである必要は ありませんが、CONSECUTIVE 編成データ・セットである必要があり、 かつ、データ・セット内の全データ が文字の形またはグラフィックの形でなければなりません。 入力のための関連ファイルをオープンし、 データ・セットに入っているレコードを読み取るか、あるいは 出力のためにファイルをオープンし、 終わりにレコードを追加してデータ・セットを拡張することができます。

データ・セットにアクセスするには、次のいずれかの方法で、 そのデータ・セットを識別する必要があります。

以下に、DD ステートメントに組み込む必須のある情報と、 ユーザーが与えることのできるオプショナル情報の一部について説明します。 ただし、ここで述べる内容は、入力ストリームのデータ・セットには当てはまりません。

必須情報

ユーザー・アプリケーションで既存の STREAM ファイルにアクセスするには 、PL/I はそのファイルのレコード長を入手する必要があります。 レコード長の値は、次のいずれかの入手源から得ることができます。

既存の OUTPUT ファイルを使用する場合、および RECSIZE の値を 提供する場合、PL/I は、ストリーム入出力によるデータ・セットの作成に説明されているように レコード長を決定します。

次の場合、PL/I は、INPUT ファイルのデフォルトのレコード長を使用します。

レコード・フォーマット

ストリーム指向データ伝送を使ってデータ・セットにアクセスするときには、 そのデータ・セットのレコード・フォーマットを知っていなくてもかまいません (ブロック・サイズを指定しなければならない場合を除く)。 各 GET ステートメントがそれぞれ個別の数の文字あるいはグラフィックスを データ・ストリームからプログラムへ転送します。

ユーザーがレコード・フォーマットの情報を与える場合は、 その情報はデータ・セットの実際の構造と矛盾しないものである必要があります。 例えば、F フォーマット・レコード、600 バイトのレコード・サイズ、およ び 3600 バイトのブロック・サイズを使って作成した データ・セットの場合、3600 バイトの最大ブロック・サイズを持った U フォーマット・レコードの 場合と同様にそのレコードにアクセスすることができます。 ただし、ブロック・サイズ 3500 を指定すると、データは切り捨てられます。

図 26 にあるプログラムは、図 24 の プログラムで作成したデータ・セットを読み取って、ファイル SYSPRINT を使って その中に入っているデータをリストします。(SYSPRINT の詳細については、SYSIN ファイルおよび SYSPRINT ファイルの使用方法を参照してください。) 各データのセットは GET ステートメントによって FREC と VREC の 2 つの変数の 中に読み込まれます。FREC には常に 45 文字が含まれ、VREC には 常に 35 文字が含まれます。GET ステートメントを実行すると、VREC は、式 7*NUM が 生成する文字数と、総文字数を 35 文字にするのに足りる数のブランク という構成になります。DD ステートメントの DISP パラメーターは単に DISP=OLD とすることもできま す。DELETE を省略すると既存のデータ・セットは削除されません。

図 26. ストリーム指向データ伝送によるデータ・セットへのアクセス
 //EX7#5  JOB
 //STEP1  EXEC IBMZCBG
 //PLI.SYSIN      DD *
  PEOPLE: PROC OPTIONS(MAIN);
          DCL WORK FILE STREAM INPUT,
              1 REC,
                2 FREC,
                  3 NAME CHAR(19),
                  3 NUM CHAR(1),
                  3 SERNO CHAR(7),
                  3 PROF CHAR(18),
                2 VREC CHAR(35),
              IN CHAR(80) DEF REC,
              EOF BIT(1) INIT('0'B);
          ON ENDFILE(WORK) EOF='1'B;
          OPEN FILE(WORK);
          GET FILE(WORK) EDIT(IN,VREC)(A(45),A(7*NUM));
          DO WHILE (¬EOF);
          PUT FILE(SYSPRINT) SKIP EDIT(IN)(A);
          GET FILE(WORK) EDIT(IN,VREC)(A(45),A(7*NUM));
          END;
          CLOSE FILE(WORK);
          END PEOPLE;
 /*
 //GO.WORK DD DSN=HPU8.PEOPLE,DISP=(OLD,DELETE)

Terms of use | Feedback

This information center is powered by Eclipse technology. (http://www.eclipse.org)