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

相対レコード・データ・セット

VSAM 相対レコード・データ・セット (RRDS) で使用できる ステートメントとオプションを、表 29 に示します。

表 29. VSAM 相対レコード・データ・セットのロードとそれへのアクセスに使用できるステートメントとオプション
ファイル
宣言1
有効ステートメント
および必須オプション
指定できるその他の
オプション
SEQUENTIAL OUTPUT
BUFFERED
WRITE FILE(file-reference)
FROM(reference);
 
LOCATE 基底付き変数
FILE(file-reference);
KEYFROM(expression) または
KEYTO(reference)
 
SET(pointer-reference)
SEQUENTIAL INPUT
BUFFERED
READ FILE(file-reference)
INTO(reference);
 
READ FILE(file-reference)
SET(pointer-reference);
 
READ FILE(file-reference);2
KEY(expression) または
KEYTO(reference)
 
KEY(expression) または
KEYTO(reference)
 
IGNORE(expression)
SEQUENTIAL UPDATE
BUFFERED
READ FILE(file-reference)
INTO(reference);
 
READ FILE(file-reference)
SET(pointer-reference);
 
READ FILE(file-reference);2
 
WRITE FILE(file-reference)
FROM(reference);
 
REWRITE FILE(file-reference);
 
 
 
DELETE FILE(file-reference);
KEY(expression) または
KEYTO(reference)
 
KEY(expression) または
KEYTO(reference)
 
IGNORE(expression)
 
KEYFROM(expression) または
KEYTO(reference)
 
FROM(reference)
および/または
KEY(expression)
 
KEY(expression)
DIRECT OUTPUT
BUFFERED
WRITE FILE(file-reference)
FROM(reference)
KEYFROM(expression);
 
DIRECT INPUT
BUFFERED
READ FILE(file-reference)
INTO(reference)
KEY(expression);
 
READ FILE(file-reference)
SET(pointer-reference)
KEY(expression);
 
DIRECT UPDATE
BUFFERED
READ FILE(file-reference)
INTO(reference)
KEY(expression);
 
READ FILE(file-reference)
SET(pointer-reference)
KEY(expression);
 
REWRITE FILE(file-reference)
FROM(reference)
KEY(expression);
 
DELETE FILE(file-reference)
KEY(expression);
 
WRITE FILE(file-reference)
FROM(reference)
KEYFROM(expression);
 
注:
  1. 完全なファイル宣言には、属性 FILE と RECORD が組み込まれています。 KEY、KEYFROM、KEYTO オプションのどれか 1 つを使用する場合は、宣言に属性 KEYED も指定する必要があります。

    DIRECT UPDATE ファイルでの UNLOCK ステートメントは VSAM RRDS に関連したファイルに使用されると無視されます。

  2. ステートメント READ FILE(file-reference); は、 ステートメント READ FILE(file-reference) IGNORE(1); と同等です。
RRDS のロード

RRDS をロードするときには、OUTPUT 用の関連ファイルをオープンする必要が あります。DIRECT ファイルまたは SEQUENTIAL ファイルを使用します。

DIRECT OUTPUT ファイルの場合、各レコードは WRITE ステートメントの KEYFROM オプション 内の相対レコード番号 (つまりキー) で指定された位置に入れられます (VSAM データ・セットのキーを参照)。

SEQUENTIAL OUTPUT ファイルの場合、KEYFROM オプションの 指定の有無に関係なく WRITE ステートメントを使用します。KEYFROM オプションを指定すると、 レコードは指定されたスロット内に置かれ、 省略した場合は、レコードは 現在位置に続くスロット内に 置かれます。 レコードを昇順の相対レコード番号順に並べる必要はありません。KEYFROM オプションを省略しても、KEYTO オプションにより、 書き込まれたレコードの相対レコード番号を入手することができます。

KEYFROM オプションも KEYTO オプションも使わずに、RRDS を順次にロードする場合は、 ファイルは KEYED 属性を持っている必要はありません。

既にレコードが存在する位置にレコードをロードしようとすることは誤りです。 KEYFROM オプションを使用する場合は、KEY 条件が生じ、 それを省略する場合は ERROR 条件が発生します。

図 45 では、データ・セットは DEFINE CLUSTER コマンドで定義され、PLIVSAM.AJC3.BASE という名前が与えられます。 それが RRDS であるという事実は、NUMBERED キーワードによって判断されます。PL/I プログラムでは、データ・セットは DIRECT OUTPUT ファイルによってロードされ、 WRITE...FROM...KEYFROM ステートメントが使用されます。

データが順に並んでいてキーが順序どおりになっていれば、SEQUENTIAL ファイル を使用して、先頭からデータ・セットに書き込むことができたはずです。 この後レコードは、次に使用できるスロットに入れられ、該当する番号が付けられます。 各レコード用のキーの番号が、KEYTO オプションを使って戻されたはずです。

PL/I ファイルは、DEFINE CLUSTER コマンドで 指定された名前を DSNAME として使用する DD ステートメントによってデータ・セットへ関連付けられます。

図 45. 相対レコード・データ・セット (RRDS) の定義とロード
 //OPT9#17  JOB
 //STEP1 EXEC PGM=IDCAMS,REGION=512K
 //SYSPRINT DD SYSOUT=A
 //SYSIN    DD *
          DEFINE CLUSTER -
              (NAME(PLIVSAM.AJC3.BASE) -
              VOLUMES(nnnnnn) -
              NUMBERED -
              TRACKS(2 2) -
              RECORDSIZE(20 20))
 /*
 //STEP2  EXEC IBMZCBG
 //PLI.SYSIN      DD *
  CRR1:   PROC OPTIONS(MAIN);
          DCL NOS FILE RECORD OUTPUT DIRECT KEYED ENV(VSAM),
              CARD CHAR(80),
              NAME CHAR(20) DEF CARD,
              NUMBER CHAR(2) DEF CARD POS(21),
              IOFIELD CHAR(20),
              EOF BIT(1) INIT('0'B);
          ON ENDFILE (SYSIN) EOF='1'B;
          OPEN FILE(NOS);
          GET FILE(SYSIN) EDIT(CARD)(A(80));
         DO WHILE (¬EOF);
          PUT FILE(SYSPRINT) SKIP EDIT (CARD) (A);
          IOFIELD=NAME;
          WRITE FILE(NOS) FROM(IOFIELD) KEYFROM(NUMBER);
          GET FILE(SYSIN) EDIT(CARD)(A(80));
          END;
          CLOSE FILE(NOS);
  END CRR1;
 /*
 //GO.NOS DD DSN=PLIVSAM.AJC3.BASE,DISP=OLD
 //GO.SYSIN DD *
 ACTION,G.           12
 BAKER,R.            13
 BRAMLEY,O.H.        28
 CHEESNAME,L.        11
 CORY,G.             36
 ELLIOTT,D.          85
 FIGGINS.E.S.        43
 HARVEY,C.D.W.       25
 HASTINGS,G.M.       31
 KENDALL,J.G.        24
 LANCASTER,W.R.      64
 MILES,R.            23
 NEWMAN,M.W.         40
 PITT,W.H.           55
 ROLF,D.E.           14
 SHEERS,C.D.         21
 SURCLIFFE,M.        42
 TAYLOR,G.C.         47
 WILTON,L.W.         44
 WINSTONE,E.M.       37
 //
SEQUENTIAL ファイルを使用した RRDS へのアクセス

RRDS にアクセスするのに使用する SEQUENTIAL ファイルは、INPUT 属性 または UPDATE 属性を使用してオープンすることができます。KEY、KEYTO、KEYFROM オプションのいずれかを使用する場合は、 属性 KEYED も指定する必要があります。

KEY オプションが指定されていない READ ステートメントの場合、レコードは、昇順の相対 レコード番号順に回復されます。 データ・セット内に空きスロットがあれば、すべてスキップされます。

KEY オプションを指定すると、READ ステートメントで回復されるレコードは、 指定した相対レコード番号を持つレコードになります。 このような READ ステートメントはデータ・セットを指定されたレコードに 位置付け、その後の順次読み取りは後続のレコードを順番に回復します。

KEYFROM オプションが指定されていても いなくても、WRITE ステートメントは、KEYED SEQUENTIAL UPDATE ファイル に使用することができます。 前回行ったアクセスの位置に関係なく、データ・セット内の任意の位置に 挿入を行うことができます。KEYFROM オプションが指定された WRITE ステートメントの場合、 そのデータ・セットに既に存在するレコードと同じ相対レコード番号 を持つレコードを挿入しようとすると、KEY 条件が発生します。KEYFROM オプションを省略すると、 現在位置から見て次のスロットにレコードが書き込まれます。 このスロットが空いていなければ、ERROR 条件が発生します。

KEYTO オプションを使えば、KEYFROM オプションを 指定していない WRITE ステートメントにより追加されるレコードのキーを回復することができます。

REWRITE ステートメントは、KEY オプションのあるなしに 関係なく、UPDATE ファイルで使用できます。KEY オプションを使用した場合、 再書き込みされるレコードは指定された相対レコード番号を持つ レコードであり、そうでない場合は直前の READ ステートメントによってアクセスされた レコードです。

DELETE ステートメントは、KEY オプションのあるなしに関係なく、 データ・セットにあるレコードを削除するのに使用することができます。

DIRECT ファイルを使った RRDS へのアクセス

RRDS にアクセスするのに 使用する DIRECT ファイルは、OUTPUT 属性、INPUT 属性、UPDATE 属性を持つことができます。KEYED SEQUENTIAL ファイルを使用する場合と同様に、レコードの読み取り、書き込 み、再書き込み、または削除が行えます。

図 46 は、RRDS の更新の例を示しています。DIRECT UPDATE ファイルが使用され、 キーによって新しいレコードが書き込まれます。VSAM では空のレコードは使用できないため、レコードが空かどうかを検査する必要はありません。

ラベル PRINT で始まるプログラムの後半では、更新済みファイルが印刷されます。 ここでも、REGIONAL(1) にあるので、空のレコードの検査は必要ありません。

PL/I ファイルは、図 46 の DEFINE CLUSTER コマンド 内で定義された DSNAME の PLIVSAM.AJC3.BASE を指定する DD ステートメントで、 データ・セットと関連づけられます。

例の終わりに、DELETE コマンドを使ってデータ・セットの削除が示されています。

図 46. RRDS の更新
 //* NOTE: WITH A WRITE STATEMENT AFTER THE DELETE FILE STATEMENT,
 //*       A DUPLICATE MESSAGE IS EXPECTED FOR CODE 'C' ITEMS
 //*       WHOSE NEWNO CORRESPONDS TO AN EXISTING NUMBER IN THE LIST,
 //*       FOR EXAMPLE, ELLIOT.
 //*       WITH A REWRITE STATEMENT AFTER THE DELETE FILE STATEMENT,
 //*       A NOT FOUND MESSAGE IS EXPECTED FOR CODE 'C' ITEMS
 //*       WHOSE NEWNO DOES NOT CORRESPOND TO AN EXISTING NUMBER IN
 //*       THE LIST, FOR EXAMPLE, NEWMAN AND BRAMLEY.
 //OPT9#18  JOB
 //STEP1  EXEC IBMZCBG
 //PLI.SYSIN      DD *
  ACR1:  PROC OPTIONS(MAIN);
                 DCL NOS FILE RECORD KEYED ENV(VSAM),NAME CHAR(20),
                   (NEWNO,OLDNO) CHAR(2),CODE CHAR(1),IOFIELD CHAR(20),
                   BYTE CHAR(1) DEF IOFIELD, EOF BIT(1) INIT('0'B),
                   ONCODE BUILTIN;
         ON ENDFILE(SYSIN) EOF='1'B;
         OPEN FILE(NOS) DIRECT UPDATE;
         ON KEY(NOS) BEGIN;
            IF ONCODE=51 THEN PUT FILE(SYSPRINT) SKIP EDIT
                     ('NOT FOUND:',NAME)(A(15),A);
            IF ONCODE=52 THEN PUT FILE(SYSPRINT) SKIP EDIT
                     ('DUPLICATE:',NAME)(A(15),A);
         END;
         GET FILE(SYSIN) EDIT(NAME,NEWNO,OLDNO,CODE)
            (COLUMN(1),A(20),A(2),A(2),A(1));
         DO WHILE (¬EOF);
         PUT FILE(SYSPRINT) SKIP EDIT (' ',NAME,'#',NEWNO,OLDNO,' ',CODE)
            (A(1),A(20),A(1),2(A(2)),X(5),2(A(1)));
         SELECT(CODE);
            WHEN('A') WRITE FILE(NOS) KEYFROM(NEWNO) FROM(NAME);
            WHEN('C') DO;
             DELETE FILE(NOS) KEY(OLDNO);
             WRITE FILE(NOS) KEYFROM(NEWNO) FROM(NAME);
            END;
            WHEN('D') DELETE FILE(NOS) KEY(OLDNO);
            OTHERWISE PUT FILE(SYSPRINT) SKIP EDIT
              ('INVALID CODE: ',NAME)(A(15),A);
         END;
         GET FILE(SYSIN) EDIT(NAME,NEWNO,OLDNO,CODE)
            (COLUMN(1),A(20),A(2),A(2),A(1));
         END;
          CLOSE FILE(NOS);
             PRINT:
          PUT FILE(SYSPRINT) PAGE;
          OPEN FILE(NOS) SEQUENTIAL INPUT;
          EOF='0'B;
          ON ENDFILE(NOS) EOF='1'B;
           READ FILE(NOS) INTO(IOFIELD) KEYTO(NEWNO);
           DO WHILE (¬EOF);
           PUT FILE(SYSPRINT) SKIP EDIT(NEWNO,IOFIELD)(A(5),A);
           READ FILE(NOS) INTO(IOFIELD) KEYTO(NEWNO);
           END;
        CLOSE FILE(NOS);
  END ACR1;

 /*
 //GO.NOS     DD DSN=PLIVSAM.AJC3.BASE,DISP=OLD
 //GO.SYSIN   DD  *
 NEWMAN,M.W.         5640C
 GOODFELLOW,D.T.     89  A
 MILES,R.              23D
 HARVEY,C.D.W.       29  A
 BARTLETT,S.G.       13  A
 CORY,G.               36D
 READ,K.M.           01  A
 PITT,W.H.             55
 ROLF,D.F.             14D
 ELLIOTT,D.          4285C
 HASTINGS,G.M.         31D
 BRAMLEY,O.H.        4928C
 //STEP3    EXEC PGM=IDCAMS,REGION=512K,COND=EVEN
 //SYSPRINT DD SYSOUT=A
 //SYSIN   DD   *
       DELETE -
           PLIVSAM.AJC3.BASE
 //

Terms of use | Feedback

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