

AWS 大型机现代化服务（托管运行时环境体验）不再向新客户开放。有关类似于 AWS 大型机现代化服务（托管运行时环境体验）的功能，请浏览 AWS 大型机现代化服务（自我管理体验）。现有客户可以继续正常使用该服务。有关更多信息，请参阅[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`是各种数据集的串联而其中任何一个数据集不受支持，则会抛出 a `RuntimeException`。当前，当与 /4 一起用作输入时，仅支持将平面文件和 GDG 世代类型作为连接文件的一部分。 DSNTEP2

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

以下是 JCL 的用法 DNSTEP4示例：

```
//********************************************************************
//* 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`会抛出 a。
+ 如果在数据库操作期间发生任何异常，则会记录一条错误消息，返回码将设置为 8，然后抛出 a`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 Signature
<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，将记录错误消息，但程序运行不会中断。

对于以下任何一种`AbendException`情况，程序返回码将设置为 8 并抛出（停止程序运行）：
+ 如果命令卡片内容为空；
+ 在解析命令处理过程中是否出现任何异常；

### 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")
                })
        }
    }
}
```

旧版的内联卡片使用直播保持 “原样”。