AWS Mainframe Modernization Service (受管執行期環境體驗) 不再向新客戶開放。對於與 AWS Mainframe Modernization Service (受管執行期環境體驗) 類似的功能,探索 AWS Mainframe Modernization Service (自我管理體驗)。現有客戶可以繼續正常使用該服務。如需詳細資訊,請參閱AWS 大型主機現代化可用性變更。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
排序公用程式
排序公用程式依賴參考具有公用程式特殊意義的資料集。因此,現代化端的所有排序公用程式都會在 groovy 指令碼中共用相同的調用模式:
mpr.withFileConfigurations(<FILE CONFIGURATIONS DETAILS>...) .withParameters(params) .runProgram("<SORT UTILITY ALIAS>")
其中 mpr是MainProgramRunner執行個體 (請參閱此頁面中的指令碼呼叫程式區段)。排序公用程式別名會在以下各節中提供。
JCL 指令碼中的 DD(資料集定義) 項目會現代化為檔案組態詳細資訊中的項目,做為 mpr.withFileConfigurations()方法的引數。如需該概念的圖例,請參閱下列範例。
SORT/SYNCSORT/ICEMAN
用途
此程式模擬各種大型主機 SORT 公用程式,用於根據提供的條件從資料集sort/merge/copy資料。您可以使用下列程式別名 (並與對應的舊版排序公用程式名稱相符):
SORTSYNCSORTICEMAN
控制卡和舊版排序公用程式功能中找到的 SORT/MERGE 指令詳細資訊不在此處提供,而是應從現有的相關舊版平台文件中擷取。
簽章
程式不會使用任何引數,而是依賴特定的資料集參考:
SYSIN資料集 (a.k.a "control card") 會保留排序/合併控制陳述式選用
SYMNAMES資料集在 SYSIN 內容中保留變數替代指令選用
SORTXDUP或SORTXSUM資料集可用來存放重複的記錄字首為
SORTIN或SORTDBIN保留要處理之記錄的資料集 (輸入)SORTOUT資料集會保留程式的結果 (輸出)某些舊版任務指令碼中找到的 SORT WORK 資料集
SORTWK定義會被忽略 (而不會在現代化呼叫中表示);排序工作資料集一律會在現代環境中動態配置其 DD 開頭為
SORTJN(字首) 的兩個資料集包含聯結金鑰指令 (用於在排序程序期間聯結資料集) 所關注的記錄
例如,考慮下列聯結金鑰指令:
JOINKEYS FILE=F1,FIELDS=(13,5,A) JOINKEYS FILE=F2,FIELDS=(24,5,A)
在這裡,聯結索引鍵的長度為 5,開頭為:
資料集中記錄的位置 13
SORTJNF1(SORTJN字首和檔案 的串連F1)資料集中記錄的位置 24
SORTJNF2(SORTJN字首和檔案 的串連F2)
檢查/錯誤處理
如果輸入檔案 (
SORTIN) 具有SHR處置但找不到,則會記錄錯誤訊息、將程式傳回碼設定為 1,並停止程式執行 (不會發生排序,不會產生輸出)
在下列情況下,會擲回RuntimeException保留專用訊息:
如果程式調用需要連線到資料庫 (使用
SORTDBIN資料集時,不是SORTIN),但找不到有效的資料來源如果輸出檔案 (
SORTOUT) 未正確定義如果無法了解或不支援在控制卡中找到的命令
如果不是為
SORT JOINKEYS案例提供兩個輸入檔案
範例用量
MERGE 範例
以下是從任務指令碼程式碼片段ICEMAN叫用的範例:
控制卡為內嵌,且命令可從輸入檔案合併欄位 (請參閱 SYSIN項目)
//* //PASOSO03 EXEC PGM=ICEMAN,REGION=0M //SORTIN01 DD DSN=input(input809a.data),DISP=SHR,LRECL=10 //SORTIN02 DD DSN=input(input809b.data),DISP=SHR,LRECL=10 //SORTOUT DD DSN=output(out809.txt),DISP=(,PASS),LRECL=10 //SORTWK01 DD SPACE=(281,(156300,156300),RLSE),AVGREC=U //SORTWK02 DD SPACE=(281,(156300,156300),RLSE),AVGREC=U //SYSIN DD * MERGE FIELDS=(1,6,PD,A,7,2,CH,A) END /*
以及相符的現代化 groovy 指令碼程式碼片段 -- 請注意,如上所述,在現代化過程中不會考慮SORTWK項目,並且內嵌的控制卡與舊版控制卡內容完全相符。
// STEP PASOSO03 - PGM - ICEMAN*************************************************** def stepPASOSO03(Object shell, Map params, Map programResults){ shell.with { if (checkValidProgramResults(programResults)) { return execStep("PASOSO03", "ICEMAN", programResults, { mpr .withFileConfigurations(new FileConfigurationUtils() .withJobContext(jobContext) .fileSystem("SORTIN01") .path("input(input809a.data)").recordSize(10) .disposition("SHR") .build() .fileSystem("SORTIN02") .path("input(input809b.data)").recordSize(10) .disposition("SHR") .build() .fileSystem("SORTOUT") .path("output(out809.txt)").recordSize(10) .normalTermination("PASS") .build() .fileSystem("SYSIN") .stream( """ MERGE FIELDS=(1,6,PD,A,7,2,CH,A) END """, getEncoding()) .build() .getFileConfigurations()) .withParameters(params) .runProgram("ICEMAN") }) } } }
簡易 SORT 範例
簡單的舊版 SORT 步驟 (任務指令碼程式碼片段) 搭配內嵌的控制卡,從 Carddemo 範例應用程式取得:
//********************************************************************* //* CREATE COPY OF TRANSACT FILE WITH CARD NUMBER AND TRAN ID AS KEY //********************************************************************* //STEP010 EXEC PGM=SORT //SORTIN DD DISP=SHR,DSN=AWS.M2.CARDDEMO.TRANSACT.VSAM.KSDS //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SORTOUT DD DSN=AWS.M2.CARDDEMO.TRXFL.SEQ, // DISP=(NEW,CATLG,DELETE),UNIT=SYSDA, // DCB=(LRECL=350,BLKSIZE=3500,RECFM=FB), // SPACE=(CYL,(1,1),RLSE) //SYSIN DD * SORT FIELDS=(263,16,CH,A,1,16,CH,A) OUTREC FIELDS=(1:263,16,17:1,262,279:279,50) /*
和相符的現代化 groovy 指令碼程式碼片段:
// STEP STEP010 - PGM - SORT****************************************************** def stepSTEP010(Object shell, Map params, Map programResults){ shell.with { if (checkValidProgramResults(programResults)) { return execStep("STEP010", "SORT", programResults, { mpr .withFileConfigurations(new FileConfigurationUtils() .withJobContext(jobContext) .bluesam("SORTIN") .dataset("AWS.M2.CARDDEMO.TRANSACT.VSAM.KSDS") .disposition("SHR") .build() .systemOut("SYSPRINT") .output("*") .build() .systemOut("SYSOUT") .output("*") .build() .fileSystem("SORTOUT") .path("AWS.M2.CARDDEMO.TRXFL.SEQ").recordSize(350) .disposition("NEW") .normalTermination("CATLG") .abnormalTermination("DELETE") .build() .fileSystem("SYSIN") .stream( """ SORT FIELDS=(263,16,CH,A,1,16,CH,A) OUTREC FIELDS=(1:263,16,17:1,262,279:279,50)""", getEncoding()) .build() .getFileConfigurations()) .withParameters(params) .runProgram("SORT") }) } } }
請注意,內嵌的控制卡會按原狀使用,而不需從舊版控制卡內容進行任何修改。
ICETOOL
用途
ICETOOL 公用程式用於在單一任務步驟 (資料處理、排序和分析) 中對資料集執行多個操作。
支援下列核心運算子:
COPY- 將資料從輸入複製到輸出檔案SORT- 使用指定的排序卡/條件排序資料SELECT- 根據條件篩選和選取特定記錄SPLICE- 從多個來源合併/聯結資料COUNT- 計算符合指定條件的記錄OCCUR- 分析資料中的出現模式
對於 SPLICE 運算子,公用程式將使用以資料區塊策略為基礎的多執行緒方法,以確保最佳化效能。
應從適當的舊版平台文件中擷取有關運算子的詳細資訊。
簽章
ICETOOL 公用程式不採用任何參數,但依賴於特定資料集:
TOOLIN資料集包含公用程式要處理的控制項陳述式TOOLMSG現代化ICETOOL公用程式目前不使用 和DFSMSG資料集 (已忽略)IN是輸入資料集的字首 (要處理的記錄)OUT是輸出資料集的字首 (由處理產生的記錄)控制卡中的控制項陳述式可能會參考其他資料集
檢查/錯誤處理
在下列情況下,RuntimeException會擲回具有相關訊息的 :
如果不支援其中一個控制項陳述式中使用的運算子
對於任何運算子,如果提供了不支援的指令
範例用量
ICETOOL SORT 範例
以下是使用 ICETOOL 進行排序的舊版 jcl 範例:
每個 SORT 運算子控制陳述式都使用專用控制卡,其參考是透過 USING 關鍵字指定
所有控制卡都會在
TOOLIN定義之後定義,並加上 (請參閱SEL1CNTL和下列*CNTL項目)
//SAMPLO52 EXEC PGM=ICETOOL,REGION=1024K //TOOLMSG DD SYSOUT=* //DFSMSG DD SYSOUT=* //IN1 DD DSN=input(input846a.data),DISP=SHR // DCB=(RECFM=F,LRECL=8) //IN2 DD DSN=input(input846b.data),DISP=SHR // DCB=(RECFM=F,LRECL=8) //OUT1 DD DSN=output(out846a.txt),DISP=(,CATLG) // DCB=(RECFM=F,LRECL=8) //OUT2 DD DSN=output(out846b.txt),DISP=(,CATLG) // DCB=(RECFM=V) //OUT3 DD DSN=output(out846c.txt),DISP=(,CATLG) // DCB=(RECFM=V) //TOOLIN DD * SORT FROM(IN1) TO(OUT1) USING(SEL1) SORT FROM(IN2) TO(OUT1) USING(SEL2) SORT FROM(IN1) TO(OUT2) USING(SEL3) SORT FROM(IN2) TO(OUT2) USING(SEL4) SORT FROM(IN1) TO(OUT3) USING(SEL5) SORT FROM(IN2) TO(OUT3) USING(SEL6) /* //SEL1CNTL DD * OPTION COPY OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')) //* //SEL2CNTL DD * OPTION COPY,SKIPREC=1 OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')) //* //SEL3CNTL DD * OPTION COPY OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' ' //* //SEL4CNTL DD * OPTION COPY,SKIPREC=1 OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' ' //* //SEL5CNTL DD * OPTION COPY OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' ' //* //SEL6CNTL DD * OPTION COPY,SKIPREC=1 OUTFIL BUILD=(1,7,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' ' //*
一旦現代化,相符的 groovy 指令碼程式碼片段如下所示:
// STEP SAMPLO52 - PGM - ICETOOL************************************************** def stepSAMPLO52(Object shell, Map params, Map programResults){ shell.with { if (checkValidProgramResults(programResults)) { return execStep("SAMPLO52", "ICETOOL", programResults, { mpr .withFileConfigurations(new FileConfigurationUtils() .withJobContext(jobContext) .systemOut("TOOLMSG") .output("*") .build() .systemOut("DFSMSG") .output("*") .build() .fileSystem("IN1") .path("input(input846a.data)").recordSize(8) .disposition("SHR") .build() .fileSystem("IN2") .path("input(input846b.data)").recordSize(8) .disposition("SHR") .build() .fileSystem("OUT1") .path("output(out846a.txt)").recordSize(8) .normalTermination("CATLG") .build() .fileSystem("OUT2") .path("output(out846b.txt)").rdw(true) .normalTermination("CATLG") .build() .fileSystem("OUT3") .path("output(out846c.txt)").rdw(true) .normalTermination("CATLG") .build() .fileSystem("TOOLIN") .stream( """ SORT FROM(IN1) TO(OUT1) USING(SEL1) SORT FROM(IN2) TO(OUT1) USING(SEL2) SORT FROM(IN1) TO(OUT2) USING(SEL3) SORT FROM(IN2) TO(OUT2) USING(SEL4) SORT FROM(IN1) TO(OUT3) USING(SEL5) SORT FROM(IN2) TO(OUT3) USING(SEL6) """, getEncoding()) .build() .fileSystem("SEL1CNTL") .stream( """ OPTION COPY OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')) """, getEncoding()) .build() .fileSystem("SEL2CNTL") .stream( """ OPTION COPY,SKIPREC=1 OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*'))""", getEncoding()) .build() .fileSystem("SEL3CNTL") .stream( """ OPTION COPY OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' '""", getEncoding()) .build() .fileSystem("SEL4CNTL") .stream( """ OPTION COPY,SKIPREC=1 OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' '""", getEncoding()) .build() .fileSystem("SEL5CNTL") .stream( """ OPTION COPY OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' '""", getEncoding()) .build() .fileSystem("SEL6CNTL") .stream( """ OPTION COPY,SKIPREC=1 OUTFIL BUILD=(1,7,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' '""", getEncoding()) .build() .getFileConfigurations()) .withParameters(params) .runProgram("ICETOOL") }) } } }
備註:
使用「原樣」的內嵌控制卡;從舊版控制卡,不會進行任何轉換
TOOLMSG和 在現代化版本中DFSMSG定義,但會在執行時間忽略在舊版和現代化版本中,控制卡都以
CNTL尾碼定義,但在TOOLIN資料集的指令中沒有尾碼來參考:例如,在 中SORT FROM(IN1) TO(OUT1) USING(SEL1),USING(SEL1)是指SEL1CNTL資料集定義
ICETOOL COPY 範例
以下是另一個使用 COPY 運算子的 ICETOOL 範例。在 jcl 指令碼程式碼片段中會加上 TOOLIN :
//SAMPLO51 EXEC PGM=ICETOOL,REGION=1024K //TOOLMSG DD SYSOUT=* //DFSMSG DD SYSOUT=* //IN1 DD DSN=input(input831.data),DISP=SHR // DCB=(RECFM=F,LRECL=12) //OUT1 DD DSN=output(out831a.txt),DISP=OLD // DCB=(RECFM=F,LRECL=12) //OUT2 DD DSN=output(out831b.txt),DISP=OLD // DCB=(RECFM=F,LRECL=12) //TOOLIN DD * COPY FROM(IN1) TO(OUT1,OUT2) USING(SEL1) /* //SEL1CNTL DD * OPTION COPY OUTFIL INCLUDE=(7,2,CH,EQ,C'10') //*
以下是相符的現代化 groovy 指令碼程式碼片段:
// STEP SAMPLO51 - PGM - ICETOOL************************************************** def stepSAMPLO51(Object shell, Map params, Map programResults){ shell.with { if (checkValidProgramResults(programResults)) { return execStep("SAMPLO51", "ICETOOL", programResults, { mpr .withFileConfigurations(new FileConfigurationUtils() .withJobContext(jobContext) .systemOut("TOOLMSG") .output("*") .build() .systemOut("DFSMSG") .output("*") .build() .fileSystem("IN1") .path("input(input831.data)").recordSize(12) .disposition("SHR") .build() .fileSystem("OUT1") .path("output(out831a.txt)").recordSize(12) .disposition("OLD") .build() .fileSystem("OUT2") .path("output(out831b.txt)").recordSize(12) .disposition("OLD") .build() .fileSystem("TOOLIN") .stream( """ COPY FROM(IN1) TO(OUT1,OUT2) USING(SEL1) COPY FROM(IN1) TO(OUT3,OUT4) COPY FROM(IN1) TO(OUT4) COPY FROM(IN1) TO(OUT5,OUT6) """, getEncoding()) .build() .fileSystem("SEL1CNTL") .stream( """ OPTION COPY OUTFIL INCLUDE=(7,2,CH,EQ,C'10')""", getEncoding()) .build() .getFileConfigurations()) .withParameters(params) .runProgram("ICETOOL") }) } } }
MFSORT
用途
此公用程式旨在模擬在 Micro Focus 環境中找到名為MFSORT 的排序公用程式的行為 (通常從命令列或在舊版環境中的指令碼中調用)。
在內部,程式會將實際的排序操作委派給SORT/SYNCSORT/ICEMAN公用程式。
簽章
僅支援下列舊版語法: mfsort take <control card>
mfsort <instructions> 不支援直接指示呼叫 為 。
它不採取任何引數;採用指令是使用參考為 的資料集來模擬TAKE,該資料集包含供MFSORT 操作的命令。
檢查/錯誤處理
如果
TAKE資料集遺失或無效,RuntimeException則會擲回此處也檢查/錯誤處理適用 ,因為委派從 MFSORT 到 SORT
範例用量
下列命令調用顯示範例的 MFSORT 用量:
mfsort take TESTSRT1.CTL
以下是相符的現代化調整後 groovy 指令碼程式碼片段:
mpr.withFileConfigurations(new FileConfigurationUtils() .fileSystem("TAKE") .path("input(TESTSRT1.CTL)") .build() .getFileConfigurations()) .withArguments("input") // relative path for use and give files .runProgram("MFSORT");