出力のSYSOUTに対して、入力データセットとなるのがSYSINです。正確には「(JCL)ストリーム内データセット」と言い、SYSOUTのOUTに対するINであることや、OSのユーティリティーの多くがそのDD名にSYSINを使用することから、SYSINデータセットと呼ばれます。JCLのDDステートメントにDSNパラメーターの代わりに「*」を指定することで、次の行からJCLステートメントではなく、プログラムへ渡す入力データを記述することができます。SYSINデータはユーティリティーやアプリケーションプログラムの機能コマンドや制御パラメーターとして非常によく利用されています。
1 2 3 4 5 6 7 8 9 10 11 |
//ALLOCATE EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DEFINE CLUSTER - ┓ (NAME(UAP1.CUSTOMER.MASTER) - ┃ここがストリーム内データセット STORCLAS(UAPVDS) - ┃ RECORDS(10000 1000) - ┃ RECORDSIZE(128 256) - ┃ KEYS(10 0) - ┃ INDEXED) ┛ // |
SYSINデータ(ストリーム内データセット)は、「*」を定義したDDステートメントの次の行から書き始めます。書き出し位置(開始桁)や構文、内容はまったくの自由で、入力するプログラムの仕様で決まります。この例ではAMSユーティリティーのDEFINE CLUSTERコマンドを記述しています。
SYSINデータはJCLと同じ80バイトの固定長レコードのデータです。80を超える長いレコード長も取り扱えますが、あまり一般的ではないと思われます。
SYSINデータの終わりは、/*ステートメントまたは別のJCLステートメント(//)によって示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//STEP1 EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DEFINE CLUSTER - ┓ (NAME(UAP1.CUSTOMER.MASTER) - ┃ここがストリーム内データセット STORCLAS(UAPVDS) - ┃ RECORDS(10000 1000) - ┃ RECORDSIZE(128 256) - ┃ KEYS(10 0) - ┃ INDEXED) ┛ //STEP2 EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DEFINE CLUSTER - ┓ (NAME(UAP1.CUSTOMER.MASTER) - ┃ここがストリーム内データセット STORCLAS(UAPVDS) - ┃ RECORDS(10000 1000) - ┃ RECORDSIZE(128 256) - ┃ KEYS(10 0) - ┃ INDEXED) ┛ /* // |
別のジョブのJCLそのものをSYSINデータとして記述したい場合があります。この場合は、DDステートメントに「*」ではなく「DATA」パラメーターを定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//SUBMIT EXEC PGM=IEBGENER //SYSPRINT DD SYSOUT=* //SYSIN DD DUMMY //SYSUT2 DD SYSOUT=(,INTRDR) //SYSUT1 DD DATA //ALLOCATE JOB ,CLASS=A,MSGCLASS=B ┓ //* ┃ //STEP1 EXEC PGM=IDCAMS ┃ //SYSPRINT DD SYSOUT=* ┃ //SYSIN DD * ┃ DEFINE CLUSTER - ┃ (NAME(UAP1.CUSTOMER.MASTER) - ┃ここがストリーム内データセット STORCLAS(UAPVDS) - ┃ RECORDS(10000 1000) - ┃ RECORDSIZE(128 256) - ┃ KEYS(10 0) - ┃ INDEXED) ┛ /* ← SYSINの終わりを示す区切り // |
/*ステートメントそのものもSYSINデータとして記述したい場合は、DLMパラメーターで区切り文字を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
//SUBMIT EXEC PGM=IEBGENER //SYSPRINT DD SYSOUT=* //SYSIN DD DUMMY //SYSUT2 DD SYSOUT=(,INTRDR) //SYSUT1 DD DATA,DLM='++' //ALLOCATE JOB ,CLASS=A,MSGCLASS=B ┓ //* ┃ //STEP1 EXEC PGM=IDCAMS ┃ //SYSPRINT DD SYSOUT=* ┃ //SYSIN DD * ┃ DEFINE CLUSTER - ┃ (NAME(UAP1.CUSTOMER.MASTER) - ┃ここがストリーム内データセット STORCLAS(UAPVDS) - ┃ RECORDS(10000 1000) - ┃ RECORDSIZE(128 256) - ┃ KEYS(10 0) - ┃ INDEXED) ┃ /* ┃ //STEP2 EXEC PGM=IDCAMS ┃ //SYSPRINT DD SYSOUT=* ┃ //SYSIN DD * ┃ DEFINE CLUSTER - ┃ (NAME(UAP1.CUSTOMER.MASTER) - ┃ STORCLAS(UAPVDS) - ┃ RECORDS(10000 1000) - ┃ RECORDSIZE(128 256) - ┃ KEYS(10 0) - ┃ INDEXED) ┛ ++ ← SYSINの終わりを示す区切り // |
SYSINからのデータ入力
COBOLにせよアセンブラーにせよ、SYSIN(ストリーム内データセット)を読み込むには固定長レコードの順次データセットとして読み込みを行えばいいのです。SYSOUT同様にプログラム自身ではSYSINから読むとかDISKのデータセットから読むとかの意識は基本的にしません。
実際のデータセットから読むか、JES2のスプールから読むかはJCLで決まります。JCLの定義を変えれば、プログラムをいじらなくても運用でデータの読み込み元を自由に変えることができます。
なお、COBOLプログラムの場合、DD名をSYSINとすればACCEPT文を書くだけでファイルアクセスよりも簡単に読み込み処理ができます。「COBOLでSYSINをアクセスする」
プロシージャーでのストリーム内データセット定義
プログラムの実行にとても便利なストリーム内データセットの機能ですが、残念ながらプロシージャー内には定義できません。プロシージャー内ではSYSIN(ストリーム内データセット)を直接定義することはできないので、そのプロシージャーを呼び出す時にDDステートメントの追加または置き換えの形で定義します。
1 2 3 4 5 6 7 8 9 10 |
//STEP1 EXEC VSAMALOC //CALLAMS.SYSIN DD * DEFINE CLUSTER - (NAME(UAP1.CUSTOMER.MASTER) - STORCLAS(UAPVDS) - RECORDS(10000 1000) - RECORDSIZE(128 256) - KEYS(10 0) - INDEXED) // |
2020年9月追記
※z/OS V1R13からは、SYSINデータ(ストリーム内データセット)をプロシージャー内に直接定義できるようになりました。さらにz/OS V2R1からは、SYSINデータ(ストリーム内データセット)内のデータそのものに対しても記号パラメーターによるデータの置換ができるようになっています。(参考「プロシージャー内のSYSINデータを記号パラメーターで変更する」)