qsam 和 vsam 命令参考

Mainframe Connector 使用 qsam 命令将排队顺序访问方法 (QSAM) 平面文件转码为 Google Cloud 兼容格式,反之亦然。Mainframe Connector 还支持 使用 vsam decode 命令将虚拟存储访问方法 (VSAM) 文件转码为 Google Cloud 兼容格式。qsamvsam 命令执行以下转码操作:

  • `qsam decode ` 命令将 QSAM 平面文件解码为 Google Cloud 兼容格式。
  • qsam encode 命令将 Google Cloud 数据编码到大型主机。
  • vsam decode 命令将 VSAM 文件解码为 Google Cloud 兼容格式。

这些操作执行对称转换,也就是说,它们将相同的数据移入和移出。 Google Cloud您可以使用 COBOL 数据结构定义在 copybook 文件中定义 QSAM 或 VSAM 文件的结构。您 还可以使用 Mainframe Connector 转码器配置文件定义高级转换。下图详细介绍了这些操作。

将大型主机数据解码为 Google Cloud
将大型主机数据解码为 Google Cloud
对来自 Google Cloud的大型主机数据进行编码
将 Google Cloud 数据编码到大型主机

本页概述了使用 qsam decodeqsam encodevsam decode 命令的转码过程、大型主机数据的物理类型和逻辑类型,以及优化行式列式 (ORC) 和 BigQuery 类型映射。

物理类型

物理类型定义了字段数据在磁盘上的布局方式。物理类型会转换为 Mainframe Connector 逻辑类型,然后可以映射到数据库类型(ORC 或 BigQuery)。

字母数字字段

字母数字字段用于处理字母数字字符串。数据被视为一系列字符,并以特定编码(例如扩展二进制编码十进制交换码 (EBCDIC))存储为字符串。如果在字母数字字段的编码或解码过程中发生任何错误,转码过程不会终止。相反,系统会在发生错误的位置放置一个用于编码的 SUB 字符,然后继续执行转码过程。

图片符号 图片属性 逻辑类型
A、B、G、N、U、X、9 DISPLAY、DISPLAY-1、NATIONAL、UTF-8 字符串

示例

01 REC
  02 STR      PIC X(10)
  02 NATIONAL PIC N(10)
  02 UTF8     PIC U(1) USAGE UTF-8

编码格式

字母数字字段的编码方式如下:

  • X 字段默认为 EBCDIC 编码
  • National (N) 字段默认为 Unicode 转换格式 16 位 (UTF-16 BE) 编码
  • UTF8 字段默认为 Unicode 转换格式 8 (UTF-8) 编码

Mainframe Connector 支持大多数单字节字符集 (SBCS) 和双字节字符集 (DBCS) 编码。如果需要,您还可以定义自己的 自定义 SBCS 编码。

二进制字段 (COMPUTATIONAL)

二进制字段存储为有符号或无符号的大端序整数。Mainframe Connector 始终将二进制字段以逻辑方式存储为 64 位有符号整数。因此,无符号长输入必须仅使用低 63 位,否则转码过程会失败。

图片符号 图片属性 逻辑类型
S、9 COMP、COMPUTATIONAL 长(64 位有符号整数)

示例

01 REC
  02 INT PIC S9(8) COMP

十六进制浮点字段 (COMP-1, COMP-2)

完全支持十六进制浮点 (HFP) 字段。 Mainframe Connector 对 HFP 字段使用单精度和双精度格式。

图片符号 图片属性 逻辑类型
COMP-1、COMP-2 双精度(64 位有符号浮点)

示例

01 REC
  03 HFP-SINGLE COMP-1.
  03 HFP-DOUBLE COMP-2.

压缩十进制字段 (COMP-3)

完全支持压缩十进制字段。在转码过程中,Mainframe Connector 会根据指定的精度和标度选择性能最高的逻辑类型。

图片符号 图片属性 逻辑类型
S、9、V COMP-3 长(64 位有符号整数)、BigInteger、Decimal64、BigDecimal

示例

01 REC
  02 DEC PIC S9(2)V9(8) COMP-3

分区十进制字段 (DISPLAY)

完全支持分区十进制字段。在转码过程中,Mainframe Connector 会根据指定的精度和标度选择性能最高的逻辑类型。

图片符号 图片属性 逻辑类型
S、9、V DISPLAY 长(64 位有符号整数)、BigInteger、Decimal64、BigDecimal

示例

01 REC
  02 DEC PIC S9(2)V9(8) DISPLAY

列表 (OCCURS)

列表是相同类型元素的有序集合。 Mainframe Connector 支持以下类型的列表:

固定列表

如果事先知道将成为列表一部分的确切项数(项计数),并且此数字始终保持不变,则使用固定列表。固定列表中的项的大小可变。

固定列表在 copybook 中的定义如下:

       01 REC.
         02 LIST OCCURS 5 TIMES       PIC X(1).
         02 FLD                       PIC X(5).

下图显示了项计数为 5 的固定列表的布局。

固定列表的布局
固定列表的布局

动态列表

如果事先知道将成为列表一部分的最大项数,则使用动态列表。但是,实际项计数未知,并且取决于另一个字段。动态列表中的项的大小可变。

动态列表的属性如下:

  • 长度字段可以转换为整数,而不会损失精度。
  • 长度字段必须在范围内
  • 在转码过程中,不会强制执行最小项计数。

动态列表在 copybook 中的定义如下:

01 REC.
  02 LEN                      PIC S9(2) BINARY.
  02 LIST OCCURS 1 TO 5 TIMES
    DEPENDING ON LEN          PIC X(1).
  02 FLD                      PIC X(5).

下图显示了最大项数为 5 的动态列表的布局。

动态列表的布局
动态列表的布局

压缩动态列表

如果将成为列表一部分的最大项数取决于另一个字段,并且这些项是压缩的,则使用压缩动态列表。

压缩动态列表的属性如下:

  • 长度字段可以转换为整数,而不会损失精度。
  • 长度字段必须在范围内
  • 在转码过程中,不会强制执行最小项计数。

压缩动态列表在 copybook 中的定义如下:

01 REC.
  02 LEN                       PIC S9(2) BINARY.
  02 LIST OCCURS UNBOUNDED
      DEPENDING ON LEN         PIC X(1).
  02 FLD                       PIC X(5).

下图显示了压缩动态列表的布局。

打包的动态列表的布局
压缩动态列表的布局

重新定义 (REDEFINES)

重新定义 是 COBOL 的一项功能,允许同一数据有多种解码 可能性。在解码过程中,重新定义在生成的表中显示为额外的列,并且数据会被多次解码。

重新定义的属性如下:

  • 对同一底层数据的重新定义不是同级字段,因此彼此 不在范围内
  • 重新定义的字段在底层字段解码时解码,而不是在声明时解码。底层字段还决定了范围 重新定义的字段。
  • 所有重新定义的字段都必须具有相同的大小,并且必须具有固定的大小。这意味着,您无法在重新定义的字段中使用可变长度的文本字段和压缩动态列表。

重新定义在 copybook 中的定义如下:

01  Rec.
05  Field-1   PIC X(100).
05  Group-1 REDEFINES Field-1.
  10  Field-2 PIC 9(5) comp-3.
  10  Field-3 PIC X(96).
05  Group-2 REDEFINES Field-1.
  10  Field-4 PIC 9(4) comp-4.
  10  Field-5 PIC X(50).
  10  Field-6 PIC X(46).

下图显示了重新定义的字段的布局。

重新定义的字段的布局
重新定义的字段的布局

您可以通过多种方式使用重新定义,包括以下最常见的方式:

  • 以两种不同的方式查看相同的数据: 这是使用重新定义的最常见方式。在编码过程中,填充数据的顺序未定义,因此您必须确保 BigQuery 中的数据在导出时保持完整性。

    示例

    01 REC.
      02 FULL-NAME                  PIC X(12).
      02 NAME REDEFINES FULL-NAME.
        05 FIRST-NAME               PIC X(6).
        05 LAST-NAME                PIC X(6).
    
  • 使用带标记的联合: 如果您只需要任何记录的数据的一种解释(具体取决于字段),则带标记的联合是使用重新定义的常见方式。您可以使用 null 指示器将不需要的解释标记为 null。由于 null 指示器具有延迟求值,因此这还可以防止它们被解析。带标记的联合的属性如下:

    • 如果定义了多个重新定义,编码过程会失败。
    • 仅实现了相等性和非相等性检查。

    示例

    01  REC.
    05  TYPE      PIC X(5).
    05  DATA      PIC X(100).
    05  VARIANT-1 REDEFINES DATA.
      10  Field-2 PIC 9(4) comp-3.
      10  Field-3 PIC X(96).
    05  VARIANT-2 REDEFINES DATA.
      10  Field-4 PIC 9(4) comp-5.
      10  Field-5 PIC X(50).
      10  Field-6 PIC X(46).
    

    您可以使用以下示例来实现带标记的联合:

    {
      "field_override": [
        {
            "field": "VARIANT-1",
            "modifier": {
              "null_if": {
                "target_field": "TYPE",
                "non_null_value": "VAR1"
              }
            }
        },
        {
            "field": "VARIANT-2",
            "modifier": {
              "null_if": {
                "target_field": "TYPE",
                "non_null_value": "VAR2"
              }
            }
        }
      ],
      "transformations": [
        {
          "field": "DATA",
          "transformation": { "exclude": {}}
        }
      ]
    }
    

逻辑类型

为了将数据转码为多种格式和从多种格式转码,Mainframe Connector 会将所有数据转换为基于逻辑类型的中间表示法 (IR)。输入和输出格式定义了如何将数据转换为任何逻辑类型和从任何逻辑类型转换。下表列出了 Mainframe Connector 支持的所有逻辑类型。

逻辑类型 说明
BigDecimal 表示任何标度和精度的十进制数。
BigInteger 表示任何大小的整数。
字节 表示大小可变的字节数组。
日期 表示独立于特定时区的日期。
Decimal64 表示范围可以容纳任何标度的 64 位有符号 整数的十进制数。
双精度型 表示 IEEE 浮点算术标准 (IEEE 754) 中描述的双精度浮点数。
列表 表示特定类型的项的列表。该列表可以包含任意数量的项。
表示 64 位有符号数字。
记录 表示一系列类型各异的固定字段。
字符串 表示与任何特定 编码无关的 Unicode 字符字符串。任何有效的 Unicode 代码点都可以表示。但是,某些 字符可能无法在所有编码过程中编码。逻辑字符串 的长度可变。
时间戳 表示独立于特定时区的时间戳。

ORC 类型映射

下表提供了 Mainframe Connector 逻辑类型到 ORC 类型的映射。

逻辑类型 ORC 类型
BigDecimal decimal
BigInteger decimal
字节 二进制 blob
日期 date
Decimal64 decimal64
双精度型 float64
列表 list
64 位整数 (bigint)
记录 结构体
字符串 UTF-8 编码的字符串
时间戳 时间戳(不含本地时区)

BigQuery 类型映射

下表提供了 Mainframe Connector 逻辑类型到 BigQuery 数据类型的映射。

逻辑类型 BigQuery 数据类型 评论
BigDecimal NUMERIC
BigInteger NUMERIC
字节 BYTES
日期 DATE
Decimal64 NUMERIC
双精度型 FLOAT64
列表 ARRAY 系统不支持嵌套列表和映射列表。
INT64
记录 STRUCT 如果联合只有一个变量,它会转换为可以为 Null 的字段。否则,联合会转换为带有可以为 Null 的字段列表的 RECORD。可以为 Null 的字段具有 field_0field_1 等后缀。在读取数据时,系统仅向其中一个字段分配值。
字符串 STRING
时间戳 TIMESTAMP

字段范围

如果一个字段是以下字段之一,则该字段被视为另一个字段的“范围内”:

  • 在需要它的字段之前定义的同级字段。
  • 在需要它的字段之前定义的父记录中的字段。