

AWS Mainframe Modernization Service （受管執行期環境體驗） 不再開放給新客戶使用。對於與 AWS Mainframe Modernization Service （受管執行期環境體驗） 類似的功能，探索 AWS Mainframe Modernization Service （自我管理體驗）。現有客戶可以繼續正常使用該服務。如需詳細資訊，請參閱[AWS 大型主機現代化可用性變更](https://docs.aws.amazon.com/m2/latest/userguide/mainframe-modernization-availability-change.html)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 資料庫公用程式
<a name="system-database-utilities"></a>

本節說明資料庫相關的公用程式。在舊版平台上，這些程式通常在 DB2 資料庫上運作，而在現代環境中選擇替代資料庫 (AWS Aurora 是熱門選擇）。

## DSNTEP2/DSNTEP4
<a name="dsntep2-dsntep4"></a>

### DSNTEP2/DSNTEP4 用途
<a name="dsntep2-purpose"></a>

DNSTEP 公用程式會從輸入資料集執行 SQL 查詢，並將結果寫入輸出資料集。它會自動重寫現代化目標資料庫 (DB2 之外） 的舊版 SQL 查詢，並支援多種`SYSIN`資料集類型：串流、Blusam 資料集、一般檔案、GDG 產生和資料集串連。

### DSNTEP2/DSNTEP4 簽章
<a name="dsntep2-signature"></a>

公用程式不採用引數，並使用兩個資料集：
+ `SYSIN`：包含 SQL 陳述式的輸入資料集
+ `SYSPRINT`：查詢結果的輸出資料集 (`SELECT`僅限查詢）

### DSNTEP2/DSNTEP4 相關組態參數
<a name="dsntep2-configuration"></a>

公用程式的行為會受到下列組態參數的影響：
+ `unload.sqlCodePointShift`
+ `unload.noPad`
+ `unload.nbi.whenNull`
+ `unload.nbi.whenNotNull`
+ `unload.useDatabaseConfiguration`
+ `unload.format.date`
+ `unload.format.time`
+ `unload.format.timestamp`
+ `hasGraphic`
+ `forcedDate`
+ `frozenDate`

如需設定這些參數的詳細資訊[選用 Web 應用程式的可用屬性](ba-runtime-key-value.md#ba-runtime-key-value-web)，請參閱 。

### DSNTEP2/DSNTEP4 檢查/錯誤處理
<a name="dsntep2-error-handling"></a>
+ 如果因為任何原因，在查詢執行期間發生例外狀況，則會記錄錯誤訊息，並`StopRunUnitException`擲回 ，導致停止目前的執行單位。
+ 如果 `SYSIN`是各種資料集的串連，且任何資料集都不受支援，`RuntimeException`則會擲回 。目前，當使用 做為 DSNTEP2/4 的輸入時，僅支援一般檔案和 GDG 世代類型做為串連檔案的一部分。

### DSNTEP2/DSNTEP4 範例用量
<a name="dsntep2-sample-usages"></a>

以下是 DNSTEP4 的範例 JCL 用量：

```
//********************************************************************
//* RETRIEVE DATA FROM TABLE AP_JBI7_INVOICE                      *
//********************************************************************
//*
//DSNTEP03 EXEC PGM=DSNTEP4,DYNAMNBR=20
//SYSPRINT DD DSN=output(out012.txt),
//            DISP=SHR,DCB=(RECFM=FB,LRECL=1152)
//SYSIN    DD *
  SELECT * FROM BUR000.AP_JBI7_INVOICE WITH UR;
```

和相符的現代化 groovy 指令碼程式碼片段：

```
def stepDSNTEP03(Object shell, Map params, Map programResults){
    shell.with {
        if (checkValidProgramResults(programResults)) {
            return execStep("DSNTEP03", "DSNTEP4", programResults, {
                    mpr
                        .withFileConfigurations(new FileConfigurationUtils()
                        .withJobContext(jobContext)
                        .fileSystem("SYSPRINT")
                        .path("output(out012.txt)").recordSize(1152)
                        .disposition("SHR")
                        .build()
                        .fileSystem("SYSIN")
                        .stream(
"""  SELECT * FROM BUR000.AP_JBI7_INVOICE WITH UR;  
  """, getEncoding())
                        .build()
                        .getFileConfigurations(fcmap))
                        .withParameters(params)
                    .runProgram("DSNTEP4")
                })
        }
    }
}
```

請注意，SQL 查詢會以「原狀」方式提供給 DSNTEP2/4 公用程式，不會進行任何修改。

## DSNUTILB
<a name="dsnutilb"></a>

### DSNUTILB 用途
<a name="dsnutilb-purpose"></a>

用於載入、複製和管理資料的資料庫公用程式。通常在舊版 DB2 資料庫上運作；現代化版本支援 AWS Aurora 和其他目標資料庫。

### DSNUTILB 簽章
<a name="dsnutilb-signature"></a>

就本質而言，DSNUTILB 寧願由現代化任務指令碼呼叫。

不採取任何引數；從`SYSIN`資料集讀取命令。

支援的命令包括：
+ `TEMPLATE` （資料集的動態配置）
+ `LISTDEF` （將資料庫物件分組到清單中，供其他命令使用）
+ `COPY` （建立資料庫物件的副本）
+ `LOAD` （將記錄載入資料表）
+ `DISCARD` （從資料表刪除記錄）

如需命令的其他詳細資訊，請參閱相關的適當舊版文件。

### DSNUTILB 相關的組態參數
<a name="dsnutilb-configuration"></a>

公用程式的行為會受到下列組態參數的影響：
+ `unload.useDatabaseConfiguration`
+ `load.format.localDate`
+ `load.format.dbDate`
+ `load.format.localTime`
+ `load.format.dbTime`
+ `load.sqlCodePointShift`
+ `convertGraphicDataToFullWidth`

如需設定這些參數的詳細資訊[選用 Web 應用程式的可用屬性](ba-runtime-key-value.md#ba-runtime-key-value-web)，請參閱 。

### DSNUTILB 檢查/錯誤處理
<a name="dsnutilb-error-handling"></a>
+ 如果`SYSIN`資料集不包含任何可用的命令，`RuntimeException`則會擲回 。
+ 如果資料庫操作期間發生任何例外狀況，則會記錄錯誤訊息，傳回碼會設為 8，並`StopRunUnitException`擲回 （停止目前的執行單位）。

### DSNUTILB 範例用量
<a name="dsnutilb-sample-usages"></a>

以下是 JCL 指令碼中 DSNUTILB 的範例用量：

```
//********************************************************************
//* LOAD DATA IN TABLE AP_JBI7_INVOICE.                           *
//********************************************************************
//DSN01  EXEC PGM=DSNUTILB,DYNAMNBR=20
//SYSREC DD  DSN=input(input021.data),
//           DISP=SHR
//           DCB=(RECFM=FB,LRECL=76)
//SYSIN  DD  DSN=input(dsn01.card),
//           DISP=SHR
```

使用命令卡內容 (dsn01.card) -- 用來從舊版平台匯出的平面檔案將資料載入資料庫 --：

```
  LOAD         DATA 
               INDDN         SYSREC
               RESUME        NO
               LOG           YES
               NOCOPYPEND
               SORTDEVT      SYSDA
               SORTNUM       12
               SORTKEYS      100000
               DISCARDS      0
               INTO TABLE    BUR000.AP_JB17_INVOICE
               WHEN (76:76) = 'L'
 ( IDENTIFIER        POSITION(1:1)        SMALLINT
  ,CUST_ID           POSITION(10)         VARCHAR
                                          NULLIF(39) = '?'
  ,CUST_KD           POSITION(40:43)      CHAR 
  ,INVC_AMNT         POSITION(44:49)      NUMERIC
  ,INVC_DAT          POSITION(50:75)      TIMESTAMP EXTERNAL(26)
 )
```

和相符的 groovy 現代化指令碼程式碼片段：

```
// STEP DSN01 - PGM - DSNUTILB****************************************************
def stepDSN01(Object shell, Map params, Map programResults){
    shell.with {
        if (checkValidProgramResults(programResults)) {
            return execStep("DSN01", "DSNUTILB", programResults, {
                mpr
                    .withFileConfigurations(new FileConfigurationUtils()
                        .withJobContext(jobContext)
                        .fileSystem("SYSREC")
                        .path("input(input021.data)").recordSize(76)
                        .disposition("SHR")
                        .build()
                        .fileSystem("SYSIN")
                        .path("input(dsn01.card)")
                        .disposition("SHR")
                        .build()
                        .getFileConfigurations(fcmap))
                    .withParameters(params)
                    .runProgram("DSNUTILB")
                    })
            }
    }
}
```

## INFUTILB / INZUTILB
<a name="infutilb-inzutilb"></a>

### INFUTILB 目的
<a name="infutilb-purpose"></a>

INFUTILB/INZUTILB 是公用程式，用於從資料庫擷取資料 -- 卸載 -- （舊版環境上的DB2)，並將其轉換為各種輸出格式。

舊版 SQL 查詢正在on-the-fly自動調整以符合現代目標資料庫需求 （支援的引擎：PostgreSQL、Oracle 和 DB2)。

### INFUTILB / INZUTILB 簽章
<a name="infutilb-signature"></a>

您可以使用下列程式別名 （並與對應的舊版排序公用程式名稱相符）：
+ `INFUTILB`
+ `INZUTILB`

公用程式不會使用任何引數，但會讀取要從`SYSIN`資料集 (「控制卡」) 執行的命令。從資料庫擷取的記錄會寫入`SYSREC`資料集，而選用的`SYSPUNCH`資料集會用來存放可用於重新載入資料的控制卡 （使用其他公用程式，例如 [DSNUTILB](#dsnutilb) )。

就本質而言，INFUTILB/INZUTILB 主要由現代化任務指令碼呼叫。

若要取得支援命令的詳細資訊，請參閱適當的舊版文件。INFUTILB/INZUTILB 使用舊版「控制卡」資料集「原樣」。

### INFUTILB / INZUTILB 相關組態參數
<a name="infutilb-configuration"></a>

公用程式的行為會受到下列組態參數的影響：
+ `unload.sqlCodePointShift`
+ `unload.noPad`
+ `unload.nbi.whenNull`
+ `unload.nbi.whenNotNull`
+ `unload.useDatabaseConfiguration`
+ `unload.format.date`
+ `unload.format.time`
+ `unload.format.timestamp`
+ `unload.columnFiller`
+ `unload.varCharIsNull`
+ `unload.DFSIGDCB`
+ `hasGraphic`
+ `forcedDate`
+ `frozenDate`

如需設定這些參數的詳細資訊[選用 Web 應用程式的可用屬性](ba-runtime-key-value.md#ba-runtime-key-value-web)，請參閱 。

### INFUTILB/INZUTILB 檢查/錯誤處理
<a name="infutilb-error-handling"></a>
+ 如果目標資料庫不屬於支援的資料庫引擎 (PostgreSQL、Oracle 和 DB2)，則程式傳回碼會設為 8`UnsupportedOperationException`，並擲出 。
+ 如果程式無法刪除暫時檔案，傳回碼將設為 4，則會記錄錯誤訊息，但不會中斷程式執行。
+ 針對下列所有情況，程式傳回碼會設為 4 或 8，並`AbendException`擲回 （停止程式執行）：
  + 如果`SYSREC`資料集不是支援的類型之一 (GDG 或檔案系統型資料集），請傳回程式碼 4；
  + 如果`SYSPUNCH`資料集不是支援的類型之一 (GDG 或檔案系統型資料集或 `DUMMY`)，請傳回程式碼 4；
  + 如果程式無法擷取`SYSREC`資料集記錄大小 （未在資料集目錄中設定或未定義）；請傳回程式碼 8；
  + 如果程式無法擷取`SYSPUNCH`資料集記錄大小 （未在資料集目錄中設定或未定義）；請傳回程式碼 8；
  + 如果用於建立`SYSREC`資料集內容的查詢無效 （將記錄錯誤的查詢），請傳回代碼 4；
  + 如果從資料庫擷取資料時發生任何例外狀況；請傳回程式碼 8；
  + 如果`SYSIN`資料集缺少 `OUTDDN`命令，則為卸載任務；傳回程式碼 8；
  + 如果在`SYSIN`資料集中找不到有效的命令；請傳回程式碼 8；

### INFUTILB / INZUTILB 範例用量
<a name="infutilb-sample-usages"></a>

以下是範例舊版 jcl 指令碼程式碼片段：

```
//********************************************************************
//* UNLOAD DATA FROM TABLE AP_JBI7_INVOICE.                       *
//********************************************************************
//INF1   EXEC PGM=INFUTILB
//SYSREC DD  DSN=output(out032.data),
//           DISP=SHR
//           DCB=(RECFM=FB,LRECL=90)
//SYSIN  DD  DSN=input(inf12.card),
//           DISP=SHR
```

使用下列命令卡 (inf12.card) 從資料庫卸載一些資料 （此處會根據記錄的日期選取記錄）：

```
  UNLOAD                                                                        
      SELECT * FROM BUR000.AP_JB17_INVOICE                                  
      WHERE INVC_DAT >= 
      CONCAT(STRIP(CHAR(YEAR(CURRENT DATE - 100 YEAR))),'-01-01-00.00.00.000000')
      AND INVC_DAT >= 
      CONCAT('2025-01-01-',CONCAT((CURRENT TIME),'.000000'))
      AND INVC_DAT >= (CURRENT TIMESTAMP - 100 YEAR)
      ORDER BY identifier ASC                                                          
        OUTDDN (SYSREC)                                                         
        FORMAT DSNTIAUL
```

和相符的 groovy 指令碼程式碼片段，自動化 jcl 現代化的結果：

```
// STEP INF1 - PGM - INFUTILB*****************************************************
def stepINF1(Object shell, Map params, Map programResults){
    shell.with {
        if (checkValidProgramResults(programResults)) {
            return execStep("INF1", "INFUTILB", programResults, {
                mpr
                    .withFileConfigurations(new FileConfigurationUtils()
                        .withJobContext(jobContext)
                        .fileSystem("SYSREC")
                        .path("output(out032.data)").recordSize(90)
                        .disposition("SHR")
                        .build()
                        .fileSystem("SYSIN")
                        .path("input(inf12.card)")
                        .disposition("SHR")
                        .build()
                        .getFileConfigurations(fcmap))
                    .withParameters(params)
                    .runProgram("INFUTILB")
                })
        }
    }
}
```

## JXHDBCLR
<a name="jxhdbclr"></a>

### JXHDBCLR 用途
<a name="jxhdbclr-purpose"></a>

JXHDBCLR 是一種資料庫清除公用程式，可在 GS21 平台上找到，可根據在命令卡中找到的特定陳述式來截斷資料表。

### JXHDBCLR 簽章
<a name="jxhdbclr-signature"></a>

它不會使用任何引數，但會從`SYSIN`資料集 （命令卡） 讀取陳述式。

由於其本質，主要旨在由現代化任務指令碼呼叫。

### JXHDBCLR 相關的組態參數
<a name="jxhdbclr-configuration"></a>

公用程式的行為會受到下列組態參數的影響：
+ `unload.sqlCodePointShift`
+ `unload.noPad`
+ `unload.nbi.whenNull`
+ `unload.nbi.whenNotNull`
+ `unload.useDatabaseConfiguration`
+ `unload.format.date`
+ `unload.format.time`
+ `unload.format.timestamp`
+ `hasGraphic`
+ `forcedDate`
+ `frozenDate`

如需設定這些參數的詳細資訊[選用 Web 應用程式的可用屬性](ba-runtime-key-value.md#ba-runtime-key-value-web)，請參閱 。

### JXHDBCLR 檢查/錯誤處理
<a name="jxhdbclr-error-handling"></a>

如果找不到要截斷的資料表，則會記錄警告訊息，但不會中斷程式執行。

如果在資料表截斷期間發生一些失敗，程式傳回碼將設為 4，將記錄錯誤訊息，但不會中斷程式執行。

針對下列任何情況，程式傳回碼會設為 8，並`AbendException`擲回 （停止程式執行）：
+ 如果命令卡內容空白；
+ 如果在剖析處理命令期間發生任何例外狀況；

### JXHDBCLR 範例用量
<a name="jxhdbclr-sample-usages"></a>

具有內嵌命令卡的範例 JXHDBCLR 用量：

```
//*******************************************************************
//**  Step 1 - JXHDBCLR UTILITY - DBCLEAR TYPE=2/3
//*******************************************************************
//STEP01  EXEC PGM=JXHDBCLR,REGION=256K,PARM='LINECNT=0'
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
    DBCLEAR    SCHEMA=MUSICSCH,TYPE=3,CHECK=YES
    DEFINE     RANGE=(SINGERDEST)
END
```

和相符的現代化 groovy 指令碼程式碼片段：

```
// STEP STEP01 - PGM - JXHDBCLR***************************************************
def stepSTEP01(Object shell, Map params, Map programResults){
 shell.with {
        if (checkValidProgramResults(programResults)) {
            return execStep("STEP01", "JXHDBCLR", programResults, {
                mpr
                    .withFileConfigurations(new FileConfigurationUtils()
                        .withJobContext(jobContext)
                        .systemOut("SYSPRINT")
                        .output("*")
                        .build()
                        .fileSystem("SYSIN")
                        .stream(
"""    DBCLEAR    SCHEMA=MUSICSCH,TYPE=3,CHECK=YES
    DEFINE     RANGE=(SINGER)
END""", getEncoding())
                        .build()
                        .getFileConfigurations())
                    .withArguments(getParm("LINECNT=0"))
                    .withParameters(params)
                    .runProgram("JXHDBCLR")
                })
        }
    }
}
```

來自舊版的內嵌卡會使用串流保持「原狀」。