連続データ・セットを作成し、それにアクセスする方法 については、図 31 のプログラムに示されています。 プログラムは、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))図 32 のプログラムは、レコード単位データ伝送を 使って、図 28 のプログラムが作成するテーブルを 印刷します。
%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;