連続データ・セットを作成し終えれば、順次入力、順次出力、 または、直接アクセス装置上のデータ・セットの場合は、更新を行うために、 その連続データ・セットにアクセスするためのファイルをオープンする ことができます。図 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 ステートメントのパラメーターを要約しています。
| パラメーター | 指定すべき事項 | 必要な場合 |
|---|---|---|
|
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 を持ち、関連データ・セット からレコードをそれぞれのバッファーに読み取るのに位置指定モードが使われます。 バッファー内の基底付き変数へのアクセスは、 ファイルがクローズされた後は行わないでください。
//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 のプログラムが作成するテーブルを 印刷します。
%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;