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

レコード入出力によるデータ・セットへのアクセスと更新

連続データ・セットを作成し終えれば、順次入力、順次出力、 または、直接アクセス装置上のデータ・セットの場合は、更新を行うために、 その連続データ・セットにアクセスするためのファイルをオープンする ことができます。図 30 は、連続データ・セットにアクセスし、 それを更新するプログラムの例です。 出力用のファイルをオープンして、その終わりにレコードを追加して データ・セットを拡張するには、DD ステートメント内に DISP=MOD を 指定しなければなりません。 それを指定しないと、そのデータ・セットは上書きされます。 更新用のファイルをオープンしても、その既存順にしかレコードを 更新することはできず、レコードを挿入したければ、新たにデータ・セットを 作成しなければなりません。表 16 は、連続データ・セットにアクセスして、 値を更新するためのステートメントとオプションを示しています。

SEQUENTIAL UPDATE ファイルで連続データ・セットにアクセスする には、READ ステートメントを使ってレコードを取り出してから、REWRITE ステートメントでそれを更新しなければなりません。 しかし、検索される各レコードの再書き込みは必要ありません。REWRITE ステートメントは、常に、最後に読み取られたレコードを更新します。

次のような場合を考慮します。

READ FILE(F) INTO(A);
     .
     .
     .
READ FILE(F) INTO(B);
     .
     .
     .
REWRITE FILE(F) FROM(A);

REWRITE ステートメントによって、2 つ目の READ ステートメントで読み取った レコードが更新されます。 最初のステートメントで読み取ったレコードは、2 つ目の READ ステートメントが実行さ れると再書き込みできません。

データ・セットにアクセスするには、DD ステートメント でそのデータ・セットをオペレーティング・システムに識別する必要があります。表 20 は、連続データ・セットに アクセスするのに必要な DD ステートメントのパラメーターを要約しています。

表 20. レコード入出力による連続データ・セットへのアクセス: DD ステートメントの必須パラメーター
パラメーター 指定すべき事項 必要な場合
DSNAME=
 
DISP=
データ・セットの名前
 
データ・セットの
後処理
常時
UNIT= または VOLUME=REF= 入力装置 データ・セットがカタログされていない場合 (すべての装置)
VOLUME=SER= ボリューム通し番号 データ・セットがカタログされていない場合 (直接アクセス)
DCB=(BLKSIZE= ブロック・サイズ1 データ・セットに標準ラベルが付いていない場合
注:
1 または、ENVIRONMENT 属性を用いれば、 PL/I プログラム内でブロック・サイズを指定することもできます。

次に、DD ステートメントに入れるべき必須情報と、 ユーザーが与えることのできるオプショナル情報のうちのいくつかについて説明します。 ただし、ここで述べる内容は、入力ストリームのデータ・セットには当てはまりません。

必須情報

データ・セットがカタログされている場合は、DD ステートメントに次の情報だけを指定する必要があります。

データ・セットがカタログされていない場合は、 データ・セットを読み取る装置、直接アクセス装置、さらに、データ・セットが入っている ボリュームの通し番号 (UNIT および VOLUME パラメーター) を指定する必要があります。

連続データ・セットの例

連続データ・セットを作成し、それにアクセスする方法 については、図 30 のプログラムに示されています。 プログラムは、2 つのデータ・セットの内容を入力ストリーム内で 組み合わせてから、それを新規データ・セット &&TEMP; に書き込みますが、 元のデータ・セットにはおのおの、EBCDIC 照合順序に並べられた 15 バイトの 固定長レコードが入っています。 INPUT1 と INPUT2 の 2 つの入力ファイルは デフォルト属性 BUFFERED を持ち、関連データ・セット からレコードをそれぞれのバッファーに読み取るのに位置指定モードが使われます。 バッファー内の基底付き変数へのアクセスは、 ファイルがクローズされた後は行わないでください。

図 30. 連続データ・セットのマージ、ソート、作成と連続データ・セットへのアクセス
 //EXAMPLE  JOB
 //STEP1 EXEC IBMZCBG
 //PLI.SYSIN   DD *
 %PROCESS INT F(I) AG A(F) OP STG NEST X(F) SOURCE ;
 %PROCESS LIST;

  MERGE: PROC OPTIONS(MAIN);
    DCL (INPUT1,                             /* FIRST INPUT FILE     */
         INPUT2,                             /* SECOND INPUT FILE    */
         OUT )      FILE RECORD SEQUENTIAL;  /* RESULTING MERGED FILE*/
    DCL SYSPRINT    FILE PRINT;              /* NORMAL PRINT FILE    */

    DCL INPUT1_EOF  BIT(1) INIT('0'B);       /* EOF FLAG FOR INPUT1  */
    DCL INPUT2_EOF  BIT(1) INIT('0'B);       /* EOF FLAG FOR INPUT2  */
    DCL OUT_EOF     BIT(1) INIT('0'B);       /* EOF FLAG FOR OUT     */
    DCL TRUE        BIT(1) INIT('1'B);       /* CONSTANT TRUE        */
    DCL FALSE       BIT(1) INIT('0'B);       /* CONSTANT FALSE       */

    DCL ITEM1       CHAR(15) BASED(A);       /* ITEM FROM INPUT1     */
    DCL ITEM2       CHAR(15) BASED(B);       /* ITEM FROM INPUT2     */
    DCL INPUT_LINE  CHAR(15);                /* INPUT FOR READ INTO  */
    DCL A           POINTER;                 /* POINTER VAR          */
    DCL B           POINTER;                 /* POINTER VAR          */

    ON ENDFILE(INPUT1) INPUT1_EOF = TRUE;
    ON ENDFILE(INPUT2) INPUT2_EOF = TRUE;
    ON ENDFILE(OUT)    OUT_EOF    = TRUE;

    OPEN FILE(INPUT1) INPUT,
         FILE(INPUT2) INPUT,
         FILE(OUT)    OUTPUT;

    READ FILE(INPUT1) SET(A);                /* PRIMING READ         */
    READ FILE(INPUT2) SET(B);

    DO WHILE ((INPUT1_EOF = FALSE) & (INPUT2_EOF = FALSE));
      IF ITEM1 > ITEM2 THEN
        DO;
          WRITE FILE(OUT) FROM(ITEM2);
          PUT FILE(SYSPRINT) SKIP EDIT('1>2', ITEM1, ITEM2)
              (A(5),A,A);
          READ FILE(INPUT2) SET(B);
        END;
      ELSE
        DO;
          WRITE FILE(OUT) FROM(ITEM1);
          PUT FILE(SYSPRINT) SKIP EDIT('1<2', ITEM1, ITEM2)
              (A(5),A,A);
          READ FILE(INPUT1) SET(A);
        END;
    END;
    DO WHILE (INPUT1_EOF = FALSE);           /* INPUT2 IS EXHAUSTED  */
      WRITE FILE(OUT) FROM(ITEM1);
      PUT FILE(SYSPRINT) SKIP EDIT('1', ITEM1) (A(2),A);
      READ FILE(INPUT1) SET(A);
    END;

    DO WHILE (INPUT2_EOF = FALSE);           /* INPUT1 IS EXHAUSTED  */
      WRITE FILE(OUT) FROM(ITEM2);
      PUT FILE(SYSPRINT) SKIP EDIT('2', ITEM2) (A(2),A);
      READ FILE(INPUT2) SET(B);
    END;

    CLOSE FILE(INPUT1), FILE(INPUT2), FILE(OUT);
    PUT FILE(SYSPRINT) PAGE;
    OPEN FILE(OUT) SEQUENTIAL INPUT;

    READ FILE(OUT) INTO(INPUT_LINE);         /* DISPLAY OUT FILE     */
    DO WHILE (OUT_EOF = FALSE);
      PUT FILE(SYSPRINT) SKIP EDIT(INPUT_LINE) (A);
      READ FILE(OUT) INTO(INPUT_LINE);
    END;
    CLOSE FILE(OUT);

  END MERGE;
 /*
 //GO.INPUT1 DD *
 AAAAAA
 CCCCCC
 EEEEEE
 GGGGGG
 IIIIII
 /*
 //GO.INPUT2 DD *
 BBBBBB
 DDDDDD
 FFFFFF
 HHHHHH
 JJJJJJ
 KKKKKK
 /*
 //GO.OUT DD DSN=&&TEMP,DISP=(NEW,DELETE),UNIT=SYSDA,
 //          DCB=(RECFM=FB,BLKSIZE=150,LRECL=15),SPACE=(TRK,(1,1))

図 31 のプログラムは、レコード単位データ伝送を 使って、図 27 のプログラムが作成するテーブルを 印刷します。

図 31. レコード単位データ伝送の印刷
%PROCESS INT F(I) AG A(F) OP STG NEST X(F) SOURCE ;
%PROCESS LIST;

 PRT: PROC OPTIONS(MAIN);
   DCL TABLE       FILE RECORD INPUT SEQUENTIAL;
   DCL PRINTER     FILE RECORD OUTPUT SEQL
                        ENV(V BLKSIZE(102) CTLASA);
   DCL LINE        CHAR(94) VAR;

   DCL TABLE_EOF   BIT(1) INIT('0'B);       /* EOF FLAG FOR TABLE   */
   DCL TRUE        BIT(1) INIT('1'B);       /* CONSTANT TRUE        */
   DCL FALSE       BIT(1) INIT('0'B);       /* CONSTANT FALSE       */


   ON ENDFILE(TABLE) TABLE_EOF = TRUE;

   OPEN FILE(TABLE),
        FILE(PRINTER);

   READ FILE(TABLE) INTO(LINE);             /* PRIMING READ         */

   DO WHILE (TABLE_EOF = FALSE);
     WRITE FILE(PRINTER) FROM(LINE);
     READ FILE(TABLE) INTO(LINE);
   END;

   CLOSE FILE(TABLE),
         FILE(PRINTER);
 END PRT;

Terms of use | Feedback

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