SYSINデータセットとは
SYSIN[データセット]
出力のSYSOUTに対して、入力データセットとなるのがSYSINです。正確には「(JCL)ストリーム内データセット」と言い、SYSOUTのOUTに対するINであることや、OSのユーティリティーの多くがそのDD名にSYSINを使用することから、SYSINデータセットと呼ばれます。JCLのDDステートメントにDSNパラメーターの代わりに「*」を指定することで、次の行からJCLステートメントではなく、プログラムへ渡す入力データを記述することができます。
SYSINデータはユーティリティーやアプリケーションプログラムの機能コマンドや制御パラメーターとして非常によく利用されています。
//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ステートメント(//)によって示します。
//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」パラメーターを定義します。
//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パラメーターで区切り文字を指定できます。
//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にアクセスする」
プロシージャーでのストリーム内データセット定義
プログラムの実行にとても便利なストリーム内データセットの機能ですが、残念ながらプロシージャー内には定義できません。ただしMVSの場合は、STARTコマンドで起動するプロシージャーのJCLを、MSTRJCLのIEFJOBS DD文に定義されたデータセットにJOB文を持つジョブのJCLとして登録すれば、そのジョブをSTCタスクとして起動することもできます。この場合のJCLはカタログ・プロシージャーではなく、ジョブ用JCLになるのでストリーム内データセットを使用できます。この場合はそのJCLをサブミットすればJOBとして実行され、STARTコマンドで起動すればSTCタスクとして実行されます。
あくまでもプロシージャー内でSYSINを使用するなら、プロシージャー内には定義できないので、そのプロシージャーを呼び出す時に、DD文の追加または置き換えの形で定義します。
//STEP1 EXEC VSAMALOC //CALLAMS.SYSIN DD * DEFINE CLUSTER - (NAME(UAP1.CUSTOMER.MASTER) - STORCLAS(UAPVDS) - RECORDS(10000 1000) - RECORDSIZE(128 256) - KEYS(10 0) - INDEXED) //