- 「メインフレーム・コンピューター」で遊ぼう - http://www.arteceed.net -

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にアクセスする」 [1]


プロシージャーでのストリーム内データセット定義

プログラムの実行にとても便利なストリーム内データセットの機能ですが、残念ながらプロシージャー内には定義できません。ただし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)
    //