JCL - Koşullu İşleme
İş Giriş Sistemi, bir JCL'de koşullu işleme gerçekleştirmek için iki yaklaşım kullanır. Bir iş tamamlandığında, yürütme durumuna bağlı olarak bir dönüş kodu belirlenir. Dönüş kodu, 0 (başarılı yürütme) ile 4095 arasında bir sayı olabilir (sıfır olmayan hata durumunu gösterir). En yaygın geleneksel değerler şunlardır:
0 = Normal - her şey yolunda
4 = Uyarı - küçük hatalar veya sorunlar.
8 = Hata - önemli hatalar veya sorunlar.
12 = Ciddi hata - büyük hatalar veya sorunlar, sonuçlara güvenilmemelidir.
16 = Terminal hatası - çok ciddi sorunlar, sonuçları kullanmayın.
Bir iş adımının yürütülmesi, önceki adımların dönüş koduna göre kontrol edilebilir. COND parametre ve IF-THEN-ELSE Bu eğitimde açıklanan yapı.
COND parametresi
Bir CONDparametresi JOB veya JCL'nin EXEC deyiminde kodlanabilir. Önceki iş adımlarının dönüş kodu üzerinde yapılan bir testtir. Test doğru olarak değerlendirilirse, mevcut iş adımının yürütülmesi atlanır. Baypas, sadece iş adımının atlanmasıdır ve anormal bir sonlandırma değildir. Tek bir testte birleştirilen en fazla sekiz koşul olabilir.
Sözdizimi
JCL COND Parametresinin temel sözdizimi aşağıdadır:
COND=(rc,logical-operator)
or
COND=(rc,logical-operator,stepname)
or
COND=EVEN
or
COND=ONLY
İşte kullanılan parametrelerin açıklaması:
rc : Bu dönüş kodudur
logical-operator : Bu, GT (Büyüktür), GE (Büyüktür veya Eşittir), EQ (Eşittir), LT (Küçüktür), LE (Küçüktür veya Eşittir) veya NE (Eşit Değil) olabilir.
stepname : Testte dönüş kodu kullanılan iş adımıdır.
Son iki koşul (a) COND = EVEN ve (b) COND = ONLY, bu eğitimde aşağıda açıklanmıştır.
COND, JOB ifadesi veya EXEC ifadesi içinde kodlanabilir ve her iki durumda da aşağıda açıklandığı gibi farklı davranır:
JOB içinde COND ifadesi
COND, JOB deyiminde kodlandığında, koşul her iş adımı için test edilir. Herhangi bir iş adımında koşul doğru olduğunda, onu takip eden iş adımlarıyla birlikte atlanır. Aşağıda bir örnek verilmiştir:
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID,COND=(5,LE)
//*
//STEP10 EXEC PGM=FIRSTP
//* STEP10 executes without any test being performed.
//STEP20 EXEC PGM=SECONDP
//* STEP20 is bypassed, if RC of STEP10 is 5 or above. //* Say STEP10 ends with RC4 and hence test is false. //* So STEP20 executes and lets say it ends with RC16.
//STEP30 EXEC PGM=SORT
//* STEP30 is bypassed since 5 <= 16.
EXEC ifadesi içindeki COND
COND, bir iş adımının EXEC ifadesinde kodlandığında ve doğru olduğu görüldüğünde, yalnızca bu iş adımı atlanır ve yürütme bir sonraki iş adımından devam ettirilir.
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=SORT
//* Assuming STP01 ends with RC0.
//STP02 EXEC PGM=MYCOBB,COND=(0,EQ,STP01)
//* In STP02, condition evaluates to TRUE and step bypassed.
//STP03 EXEC PGM=IEBGENER,COND=((10,LT,STP01),(10,GT,STP02))
//* In STP03, first condition fails and hence STP03 executes. //* Since STP02 is bypassed, the condition (10,GT,STP02) in //* STP03 is not tested.
COND = EVEN
COND = EVEN kodlandığında, önceki adımlardan herhangi biri anormal şekilde sona erse bile mevcut iş adımı yürütülür. Başka herhangi bir RC koşulu, COND = EVEN ile birlikte kodlanırsa, RC koşullarından hiçbiri doğru değilse, iş adımı yürütülür.
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=SORT
//* Assuming STP01 ends with RC0.
//STP02 EXEC PGM=MYCOBB,COND=(0,EQ,STP01)
//* In STP02, condition evaluates to TRUE and step bypassed.
//STP03 EXEC PGM=IEBGENER,COND=((10,LT,STP01),EVEN)
//* In STP03, condition (10,LT,STP01) evaluates to true, //* hence the step is bypassed.
COND = SADECE
COND = ONLY kodlandığında, mevcut iş adımı, yalnızca önceki adımlardan herhangi biri anormal şekilde sona erdiğinde yürütülür. Başka herhangi bir RC koşulu, COND = ONLY ile birlikte kodlanırsa, RC koşullarından hiçbiri doğru değilse ve önceki iş adımlarından herhangi biri anormal şekilde başarısız olursa, iş adımı yürütülür.
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=SORT
//* Assuming STP01 ends with RC0.
//STP02 EXEC PGM=MYCOBB,COND=(4,EQ,STP01)
//* In STP02, condition evaluates to FALSE, step is executed //* and assume the step abends.
//STP03 EXEC PGM=IEBGENER,COND=((0,EQ,STP01),ONLY)
//* In STP03, though the STP02 abends, the condition //* (0,EQ,STP01) is met. Hence STP03 is bypassed.
IF-THEN-ELSE Yapısı
İş sürecini kontrol etmek için başka bir yaklaşım, IF-THEN-ELSE yapılarını kullanmaktır. Bu, koşullu işleme için daha fazla esneklik ve kullanıcı dostu bir yol sağlar.
Sözdizimi
JCL IF-THEN-ELSE Yapısının temel sözdizimi aşağıdadır:
//name IF condition THEN
list of statements //* action to be taken when condition is true
//name ELSE
list of statements //* action to be taken when condition is false
//name ENDIF
Aşağıdaki IF-THEN-ELSE Yapısında kullanılan terimlerin açıklaması aşağıdadır:
name : Bu isteğe bağlıdır ve bir ad, alfabe, #, $ veya @ ile başlayan 1 ila 8 alfanümerik karakter içerebilir.
Condition : Bir koşulun bir biçimi olacaktır: KEYWORD OPERATOR VALUE, nerede KEYWORDSRC (Dönüş Kodu), ABENDCC (Sistem veya kullanıcı tamamlama kodu), ABEND, RUN (başlatılan adım yürütme) olabilir. BirOPERATOR mantıksal operatör (VE (&), OR (|)) veya ilişkisel operatör (<, <=,>,> =, <>) olabilir.
Misal
Aşağıda IF-THEN-ELSE'nin kullanımını gösteren basit bir örnek verilmiştir:
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//PRC1 PROC
//PST1 EXEC PGM=SORT
//PST2 EXEC PGM=IEBGENER
// PEND
//STP01 EXEC PGM=SORT
//IF1 IF STP01.RC = 0 THEN
//STP02 EXEC PGM=MYCOBB1,PARM=123
// ENDIF
//IF2 IF STP01.RUN THEN
//STP03a EXEC PGM=IEBGENER
//STP03b EXEC PGM=SORT
// ENDIF
//IF3 IF STP03b.!ABEND THEN
//STP04 EXEC PGM=MYCOBB1,PARM=456
// ELSE
// ENDIF
//IF4 IF (STP01.RC = 0 & STP02.RC <= 4) THEN
//STP05 EXEC PROC=PRC1
// ENDIF
//IF5 IF STP05.PRC1.PST1.ABEND THEN
//STP06 EXEC PGM=MYABD
// ELSE
//STP07 EXEC PGM=SORT
// ENDIF
Biraz daha detaylı anlamak için yukarıdaki programa bakalım:
STP01'in dönüş kodu IF1'de test edilir. 0 ise, STP02 yürütülür. Aksi takdirde, işlem bir sonraki IF deyimine (IF2) gider.
IF2'de, STP01 yürütmeye başladıysa, STP03a ve STP03b yürütülür.
IF3'te, STP03b ABEND değilse, STP04 yürütülür. ELSE'de hiçbir ifade yoktur. NULL ELSE ifadesi denir.
IF4'te, eğer STP01.RC = 0 ve STP02.RC <= 4 DOĞRU ise, o zaman STP05 çalıştırılır.
IF5'te, STP05 ABEND iş adımında PROC PRC1'deki proc adımı PST1 ise, STP06 yürütülür. Başka bir STP07 yürütülür.
IF4 yanlış olarak değerlendirilirse, STP05 yürütülmez. Bu durumda, IF5 test edilmez ve STP06, STP07 adımları yürütülmez.
IF-THEN-ELSE, kullanıcının işi iptal etmesi, iş süresinin dolması veya bir veri kümesinin atlanan bir adıma geriye dönük referans olması gibi işin anormal şekilde sonlandırılması durumunda yürütülmeyecektir.
Kontrol Noktalarını Ayarlama
JCL programınızın içindeki kontrol noktası veri setini aşağıdakileri kullanarak ayarlayabilirsiniz: SYSCKEOV, bir DD ifadesidir.
Bir CHKPTDD ifadesindeki çok hacimli QSAM veri kümeleri için kodlanmış parametredir. Bir CHKPT, CHKPT = EOV olarak kodlandığında, girdi / çıktı çok hacimli veri kümesinin her hacminin sonunda SYSCKEOV deyiminde belirtilen veri kümesine bir kontrol noktası yazılır.
//CHKSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=MYCOBB
//SYSCKEOV DD DSNAME=SAMPLE.CHK,DISP=MOD
//IN1 DD DSN=SAMPLE.IN,DISP=SHR
//OUT1 DD DSN=SAMPLE.OUT,DISP=(,CATLG,CATLG)
// CHKPT=EOV,LRECL=80,RECFM=FB
Yukarıdaki örnekte, SAMPLE.OUT çıktı veri kümesinin her hacminin sonunda SAMPLE.CHK veri kümesine bir kontrol noktası yazılmıştır.
İşlemeyi Yeniden Başlat
Eter işlemeyi otomatik yolu kullanarak yeniden başlatabilirsiniz. RD parameter veya kullanma kılavuzu RESTART parameter.
RD parameter JOB veya EXEC deyiminde kodlanmıştır ve otomatik JOB / STEP yeniden başlatmaya yardımcı olur ve dört değerden birini tutabilir: R, RNC, NR veya NC.
RD=R otomatik yeniden başlatmaya izin verir ve DD ifadesinin CHKPT parametresinde kodlanmış kontrol noktasını dikkate alır.
RD=RNC otomatik yeniden başlatmaya izin verir, ancak CHKPT parametresini geçersiz kılar (yok sayar).
RD=NRişin / adımın otomatik olarak yeniden başlatılamayacağını belirtir. Ancak RESTART parametresi kullanılarak manuel olarak yeniden başlatıldığında, CHKPT parametresi (varsa) dikkate alınacaktır.
RD=NC otomatik yeniden başlatmaya ve denetim noktası işlemeye izin vermez.
Yalnızca belirli durdurma kodları için otomatik yeniden başlatma gereksinimi varsa, o zaman SCHEDxx IBM sistemi parmlib kitaplığı üyesi.
RESTART parameterJOB veya EXEC deyiminde kodlanmıştır ve iş hatasından sonra JOB / STEP'in manuel olarak yeniden başlatılmasına yardımcı olur. RESTART'a, SYSCKEOV DD deyiminde kodlanmış veri kümesinde yazılı kontrol noktası olan bir kontrol kimliği eşlik edebilir. Bir kontrol kimliği kodlandığında, SYSCHK DD ifadesi, JOBLIB ifadesinden (varsa) sonra, JOB ifadesinden sonra kontrol noktası veri setine referans verecek şekilde kodlanmalıdır.
//CHKSAMP JOB CLASS=6,NOTIFY=&SYSUID,RESTART=(STP01,chk5)
//*
//SYSCHK DD DSN=SAMPLE.CHK,DISP=OLD
//STP01 EXEC PGM=MYCOBB
//*SYSCKEOV DD DSNAME=SAMPLE.CHK,DISP=MOD
//IN1 DD DSN=SAMPLE.IN,DISP=SHR
//OUT1 DD DSN=SAMPLE.OUT,DISP=(,CATLG,CATLG)
// CHKPT=EOV,LRECL=80,RECFM=FB
Yukarıdaki örnekte, chk5 checkid'dir, yani STP01 kontrol noktası5'te yeniden başlatılır. Lütfen bir SYSCHK ifadesinin eklendiğine ve SYSCKEOV ifadesinin Kontrol Noktası Ayarlama bölümünde açıklanan önceki programda yorumlandığına dikkat edin.