区分データセットのコピー(IEBCOPY)
全メンバーをそのままコピーする
// JOB Statement //********************************************************************* //* Sample JCL - IEBCOPY //* ==================== //********************************************************************* //IEBCOPY EXEC PGM=IEBCOPY //SYSPRINT DD SYSOUT=* //SYSUT1 DD DISP=SHR,DSN=input dsname //SYSUT2 DD DISP=SHR,DSN=output dsname //SYSIN DD DUMMY //
まずは基本形、SYSUT1→SYSUT2へ全メンバーをそのままコピーする。同名のメンバーはコピーされない。
VOS3ではSYSINカードは省略できない。必ずCOPY制御文が必要。
//SYSIN DD * COPY I=SYSUT1,O=SYSUT2 //
同名のメンバーの上書きコピー
// JOB Statement //********************************************************************* //* Sample JCL - IEBCOPY //* ==================== //********************************************************************* //IEBCOPY EXEC PGM=IEBCOPY //SYSPRINT DD SYSOUT=* //SYSUT1 DD DISP=SHR,DSN=input dsname //SYSUT2 DD DISP=SHR,DSN=output dsname //SYSIN DD * COPY I=((SYSUT1,R)),O=SYSUT2 //
これも基本形だが、同名のメンバーは上書きコピーされる。
メンバーの選択コピー(以降はSYSIN DD文のみ示します)
//SYSIN DD * C I=SYSUT1,O=SYSUT2 S M=(mem1,mem2,mem3) //
メンバーを選択してコピーするならこう指定すればよい。CはCopy、SはSelect。
特定のメンバーのみを上書きコピーする
//SYSIN DD * C I=SYSUT1,O=SYSUT2 S M=((membername,,R)) //
異なるブロックサイズのデータセット間での、ロードモジュールのコピー
//SYSIN DD * COPYMOD I=SYSUT1,O=SYSUT2 //
大きなブロックサイズから小さなブロックサイズのデータセットへコピーする場合は、このCOPYMODを使わないと不完全な形でロードモジュールがコピーされてしまう。ロードモジュールのように不定長レコードを持つ場合、読み出したブロックが4KBあっても書き出し先データセットのブロック長が2KBしかなければ先頭の2KB分しかコピーされない。そのためモジュールの実行時に何が起きるかわからない。
複数のライブラリーからメンバーを選択してコピーする
//IN1 DD DISP=SHR,DSN=dsname1 //IN2 DD DISP=SHR,DSN=dsname2 //OUT DD DISP=(,CATLG),output dsname, // UNIT=SYSDA,VOL=SER=??????,SPACE=(CYL,(??,??,??)) //SYSIN DD * COPY I=(IN1,IN2),O=OUT S M=(mem1,mem2,mem3) S M=(mem4,(mem5,newname5)) //
複数のデータセットからメンバーを選択することもできる。STEPを分けてそれぞれ入力データセットを変えてもかまわないが、こちらの方がスマートである。入力元データセットそれぞれに同名メンバーがある場合、INDDパラメーターで指定された順番でメンバーが見つけられ選択される。コピーされたメンバーがどのデータセットから選択されたなど、コピー処理の実行情報がSYSPRINTに出力される。意図した通りにコピーが行われたかをこのリストで確認できる。
複数のライブラリーに散在しているメンバーを1つのライブラリーに(メンバーのマージ)まとめたいような時に利用できる。逆に1つの入力ライブラリーから複数の出力ライブラリーに分散コピーすることもできる。
//IN DD DISP=SHR,DSN=dsname //OUT1 DD DISP=(,CATLG),output dsname1, // UNIT=SYSDA,VOL=SER=??????,SPACE=(CYL,(??,??,??)) //OUT2 DD DISP=(,CATLG),output dsname2, // UNIT=SYSDA,VOL=SER=??????,SPACE=(CYL,(??,??,??)) //SYSIN DD * COPY I=IN,O=OUT1 S M=(mem1,mem2,mem3) COPY I=IN,O=OUT2 S M=(mem4,mem5) //