Job Control Language

Uit Wikipedia, de vrije encyclopedie

Job Control Language (beter bekend onder de afkorting JCL) is een scripttaal die op IBM-mainframes wordt gebruikt om opdrachten te geven aan het Job Entry Subsystem (JES2 of JES3) waarmee een batchprogramma of subsysteem kan worden gestart.

Met JCL kan (dure) CPU-tijd op mainframes verdeeld worden tussen verschillende bedrijven, en gespreid worden over de tijd, aan de hand van prioriteitscodes.

Syntaxis[bewerken | brontekst bewerken]

Om compatibel te zijn met bestaande programmatuur is de basissyntaxis van JCL, dat ook in het huidige z/OS wordt gebruikt, niet gewijzigd sinds de jaren 1960.

JCL wordt gekenmerkt door het tweetal schuine strepen ('slashes') die het begin aangeven van elke statement. Dit gebruik van schuine strepen als beginmarkering komt uit de tijd dat ponskaarten gebruikt werden om JCL-code in te voeren. Als de stapel ponskaarten per ongeluk achterstevoren in de kaartlezer werd geplaatst, stonden de schuine strepen niet aan het begin van de regel en werd de stapel ponskaarten afgekeurd.

//USER0001 JOB REKNR01,JORIS,CLASS=7,MSGCLASS=X FACTUREN MAKEN
//VRAAGOP EXEC PGM=REKINF,TIME=(,50)
//INVOER DD DSN=SYSUSR1.SYSTEM.INPUT,DISP=SHR OPENEN
//OPSLAAN DD SYSOUT=*

Een JCL-regel moet voldoen aan volgende voorwaarden:

  • Elke regel begint met "//", met uitzondering van in-stream data
  • Er staan maximaal 80 tekens op een regel.
  • JCL-commando's staan altijd in hoofdletters.
  • Commando's staan enkel tussen posities 3 en 71; alles vanaf positie 72 wordt als niet-uitvoerbare commentaar (bijvoorbeeld regelnummers) gezien. Om de commandolijn te vervolgen op de volgende regel, moet de voorgaande regel eindigen op een komma.
  • JCL-commando's bestaan uit drie blokken die binnen het blok geen spaties hebben:
    • een vrij te kiezen naam van het commando (maximaal 8 tekens), zodat ernaar verwezen kan worden
    • de bewerking (JOB, EXEC, DD, OUTPUT, ...)
    • de parameters
      • de positionals: vaste parameters die altijd in die volgorde dienen voor te komen (bij weglating moet nog steeds een komma geschreven worden)
      • de keywords: parameterbepalingen zonder vaste plaats die steeds bestaan uit twee leden: het sleutelwoord en de waarde, met daartussen een gelijkheidsteken.
    • Alles wat erna komt, wordt als commentaar beschouwd.

JOB[bewerken | brontekst bewerken]

//USR007 JOB ACCN099,JODY,CLASS=6,MSGCLASS=X
  • gebruikersnaam
  • JOB
  • accountnummer, jobnaam en sleutelwoorden:
    • CLASS, PRTY: priority; prioriteitscodes
    • MSGCLASS
    • TYPRUN: proeflezen met SCAN, wachten met HOLD
    • TIME=(mm,ss): in minuten en seconden
    • REGION: schijfruimte (in k of M (bytes))
    • NOTIFY: te verwittigen user-id
    • COND: condition; stopvoorwaarde

EXEC[bewerken | brontekst bewerken]

//STAP1 EXEC PGM=INLEZEN,COND=(0,NE),PARM=(ZIN=OPLOPEND,AANTAL=100)
  • naam
  • EXEC: executable
  • PGM, PROC: program, procedure; programma- of procedurenaam en sleutelwoorden:
    • TIME=(mm,ss): in minuten en seconden
    • REGION: schijfruimte (in k of M (bytes))
    • PARM: parameters om mee te geven aan het uit te voeren programma
    • COND: condition; stopvoorwaarde
    • IF (voorwaarde) THEN//ELSE//ENDIF: voorwaarde-constructie


DD[bewerken | brontekst bewerken]

//INVOER DD DSN=ISUSR.USR007.INPUT,DISP=SHR
//UITVOER DD DSN=ISUSR.USR007.OUTPUT,DISP=(NEW,KEEP,DELETE),
//           DCB=(RECFM=FB,LRECL=80),SDORG=PO,
//           SPACE=(TRK,(5,3,10))
//UITVOER2 DD DSN=ISUSR.USR007.OUTPUT,DISP=(NEW,KEEP,DELETE),
//            REFDD=*.STEP1.UITVOER
//MANUEEL DD *
04/01/1980
13/09/1979
10/12/1982
15/03/1986
/*
  • naam
  • DD: data definition
    • DSN: data set name
    • DCB: data control block
      • RECFM: record format
      • LRECL: local record length
    • DSORG: data set organisation; sequentieel (PS) of gepartitioneerd (PO)

Er bestaan ook vooraf gespecifieerde namen voor bepaalde datasets:

  • JOBLIB, STEPLIB: library voor betreffende job of stap
  • SYSIN: in-stream gegevens
  • SYSABEND, SYSMDUMP, SYSUDUMP, CEEDUMP: dumps
  • SYSCHK, SYSCKEOV: checkpoints

INCLUDE[bewerken | brontekst bewerken]

//USR009 JOB ACCN099,APRILIA,CLASS=8,MSGCLASS=X
//VERWYZING JCLLIB ORDER=(ISUSR.USR007.SOURCE,ISUSR.USR009.SOURCE)
//GO EXEC PGM=P3OEF4
//STEPLIB DD DSN=ISUSR.COBOL.LINKLIB,DISP=SHR
//TOEVOEGEN INCLUDE MEMBER=OEF3
//
  • INCLUDE laat toe om programmacode te hergebruiken: de code van een ander script kan hiermee opgevraagd worden. Het script moet zich in het zoekpad van JCLLIB bevinden.

PROC[bewerken | brontekst bewerken]

//DEMOJCL PROC
//STAPA EXEC PGM=OEF7,TIME=(,08),REGION=&GROOTTE
//STEPLIB DD DSN=&PREFIX..COBOL.LINKLIB,DISP=SHR
//INVOER DD DSN=&PREFIX..LIST,DISP=SHR
// PEND
//PROC12 EXEC DEMOJCL,GROOTTE=256K,PREFIX=ISUSR

Procedures laten toe om modulair te werken; ze kan op verschillende plaatsen opgeroepen worden. Bovendien kunnen variabele parameters gebruikt worden: de ampersand & en het punt (indien noodzakelijk) begrenzen de parameternaam

JCL-output[bewerken | brontekst bewerken]

In de SPOOL (Simultaneous Peripheral Operations On-Line) komt de informatie over het proeflezen en uitvoeren van het script terecht. Het script zelf wordt hier ook in opgenomen. Opgeroepen procedures uit het script zelf worden voorafgegaan door ++ in plaats van //; de procedures die met INCLUDE ingevoegd worden vanuit een ander bestand, worden voorafgegaan door XX.

Voorbeeldskelet[bewerken | brontekst bewerken]

//SU0003CL JOB (XXXX000),'TEST',CLASS=7,MSGCLASS=X
//**********************************************************************
//**                                                                ****
//*   PLEASE FILL IN THE COURSE DATASET PREFIX ON THE NEXT LINE
//**                                                                ****
//**********************************************************************
//JCLPROG  PROC PREFIX='.........'
//**********************************************************************
//*    COMPILE THE COBOL PROGRAM                                        
//**********************************************************************
//COB      EXEC PGM=IGYCRCTL                                            
//STEPLIB  DD  DSN=SYS3.IGY.V2R1M0.SIGYCOMP.LOCU,DISP=SHR
//SYSLIB   DD  DSN=TBISUSR.JCLCRS.SOURCE,DISP=SHR                       
//SYSLIN   DD  DSN=&&OBJECT,DISP=(MOD,PASS),SPACE=(CYL,(1,5))           
//SYSTERM  DD  SYSOUT=*                                                 
//SYSPRINT DD  SYSOUT=*                                                 
//SYSUDUMP DD  SYSOUT=*                                                 
//SYSUT1   DD  SPACE=(CYL,(2,5)),UNIT=SYSDA                             
//SYSUT2   DD  SPACE=(CYL,(2,5)),UNIT=SYSDA                             
//SYSUT3   DD  SPACE=(CYL,(2,5)),UNIT=SYSDA                             
//SYSUT4   DD  SPACE=(CYL,(2,5)),UNIT=SYSDA                             
//SYSUT5   DD  SPACE=(CYL,(2,5)),UNIT=SYSDA                             
//SYSUT6   DD  SPACE=(CYL,(2,5)),UNIT=SYSDA                             
//SYSUT7   DD  SPACE=(CYL,(2,5)),UNIT=SYSDA                             
//SYSIN    DD  DSN=&PREFIX..JCLCRS.SOURCE(&MEMBER),DISP=SHR             
//**********************************************************************
//*    LINK EDIT THE COBOL PROGRAM                                      
//**********************************************************************
//LKED   EXEC  PGM=IEWL,PARM='LIST,MAP,XREF',COND=(8,LE)                
//SYSUT1   DD  SPACE=(CYL,(1,1)),UNIT=SYSDA                             
//SYSPRINT DD  SYSOUT=*                                                 
//SYSLIB   DD  DSN=SYS2.COBOL2.LOAD,DISP=SHR                            
//         DD  DSN=SYS2.COBOL2.SUB.LOAD,DISP=SHR                        
//         DD  DSN=SYS2.COBOL2.SUB.LPA.LOAD,DISP=SHR                    
//         DD  DSN=&PREFIX..JCLCRS.LOAD,DISP=SHR
//SYSLMOD  DD  DSN=&PREFIX..JCLCRS.LOAD(&MEMBER),DISP=SHR
//SYSLIN   DD  DSN=&&OBJECT,DISP=(OLD,DELETE)
//        PEND
//**********************************************************************00010000
//CREATSUB EXEC JCLPROG,MEMBER=SUBRETCD
//CREATPGM EXEC JCLPROG,MEMBER=PGMRETCD
//

Externe links[bewerken | brontekst bewerken]