Job Control Language
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:
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:
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 //