コピーブック パーサーのリファレンス

Mainframe Connector は、標準の COBOL コピーブックをサポートする ANTLR4 ベースのパーサーを使用します。

このドキュメントでは、コピーブック パーサーによって実行される前処理タスク、サポートされているデータ型と使用制限、qsam decode コマンドと qsam encode コマンドでトランスコーダ構成を使用して構成フィールドを構成する方法について説明します。

Preprocessing

コピーブックを解析する前に、コピーブック パーサーはデータを前処理し、次の手順を実行します。

  • コメント行(7 列目の *、またはインラインの *> コメントと *>CE コメント)を削除します。
  • 行の継続(7 列目の - の後に引用符で囲まれたリテラルが続く)を解決します。
  • シーケンス番号領域(列 1 ~ 6)と列 73 以降を空白にします。コードは 8 列目以降から始める必要があります。
  • EJECT、SKIP1、SKIP2、SKIP3、TITLE などのプリプロセッサ固有のステートメントを保持します。これらのステートメントは解析されますが、無視されます。COPY REPLACING で使用できるプリプロセッサ パラメータを含むコピーブックは、コピーブック パーサーでサポートされていません。これらのコピーブックでは、識別子はコロン(:)で囲まれています。

サポートされているデータ型と制限事項

コピーブック パーサーでサポートされているデータ型と、その使用に関する制限事項は次のとおりです。

  • コピーブックで使用できる最上位の 01 レコードは 1 つのみです。01 レコードに OCCURS 句を含めることはできません。
  • レベル 66(RENAMES / エイリアス)とレベル 77(スタンドアロン)のフィールドはサポートされていません。レベル 88(条件名)は解析され、無視されます。
  • 16 進浮動小数点フィールド(COMP-1 と COMP-2)を除き、すべての基本(非グループ)フィールドに PICTURE 句が必要です。次の PICTURE フィールドがサポートされています。
    • 英字(PIC A)、英数字(PIC X)、英数字編集(A、X、9、B、0、/)。
    • PIC G(DBCS、USAGE DISPLAY-1 が必要)。
    • PIC N(ナショナルまたは DBCS)とナショナル編集(N、B、0、/)。
    • PIC U(UTF-8)。PIC U BYTE-LENGTH n を含みます。
    • 数値(9、S、V)と数値編集($、B、/、V、Z、0、9、,、.、*、+、-、CR、DB)。PIC P(スケーリング位置)はサポートされていません。
    • 精度が 18 までのゾーン 10 進数フィールドとパック 10 進数フィールドは 64 ビット型(LONG または DECIMAL64)にデコードされ、高精度フィールドは任意精度型(BIG_INTEGER または BIG_DECIMAL)にデコードされます。schema_validation_mode が BIG_QUERY に設定されている場合、サポートされる最大精度は 76(BIGNUMERIC)で、最大スケールは 38 です(POSTGRES の場合、最大精度は 147,455、最大スケールは 16,383 です。MYSQL の場合、最大精度は 65、最大スケールは 30 です)。
  • IBM 16 進浮動小数点(HFP)は、COMP-1 / COMPUTATIONAL-1(単精度、4 バイト)と COMP-2 / COMPUTATIONAL-2(倍精度、8 バイト)を使用するか、トランスコーダ構成で hfp フィールド修飾子を適用することでサポートされます。
  • REDEFINES 句は、再定義されたすべてのバリアントのバイトサイズが同じである場合に、静的サイズのフィールドでサポートされます。再定義されたフィールドは、OCCURS DEPENDING ON 句の長さフィールドまたは null_if 修飾子の target_field として参照できません。
  • OCCURS 句は、固定長配列(OCCURS n TIMES)、動的長配列(OCCURS min TO max TIMES DEPENDING ON field)、パックされた動的長配列(OCCURS UNBOUNDED DEPENDING ON field)でサポートされています。OCCURS 句の ASCENDING/DESCENDING KEY フレーズと INDEXED BY フレーズはサポートされていません。DEPENDING ON はスコープ内のフィールド名を参照する必要があります。
  • 次の USAGE 句のみがサポートされています。
    • DISPLAY(英数字フィールドとゾーン 10 進数フィールドのデフォルト)
    • DISPLAY-1(DBCS)
    • NATIONAL(PIC N フィールドのデフォルト。UTF-16BE としてエンコードされます)
    • UTF-8(PIC U フィールドのデフォルト)
    • BINARY、COMP、COMPUTATIONAL、COMP-4、COMPUTATIONAL-4、COMP-5、COMPUTATIONAL-5
    • COMP-3、COMPUTATIONAL-3、PACKED-DECIMAL
    • COMP-1、COMPUTATIONAL-1、COMP-2、COMPUTATIONAL-2
  • DATE と TIMESTAMP は、トランスコーダ構成を使用してサポートされます。
  • Null インジケーターは、トランスコーダ構成を使用してサポートされます。
  • 2 バイト文字セット(DBCS)フィールド PIC G と PIC N がサポートされています。デフォルトでは、USAGE 句のない PIC N フィールドには USAGE NATIONAL(UTF-16BE)が割り当てられます。PIC N フィールドを DBCS として使用するには、コピーブックで USAGE DISPLAY-1 を指定するか、トランスコーダ構成で文字エンコードをオーバーライドします。
  • 可変長文字列は、トランスコーダ構成を使用してサポートされます。
  • SIGN 句(LEADING、TRAILING、SEPARATE CHARACTER)がサポートされています。
  • コメントがサポートされています。

日付フィールドとタイムスタンプ フィールドのサポート

メインフレーム コネクタは、トランスコーダ構成(--transcode-configuration)の format_date フィールド修飾子と format_timestamp フィールド修飾子を使用して、日付とタイムスタンプ フィールドのデコードとエンコードをサポートしています。これらの修飾子は、field_suffixes を使用して一致するフィールドに適用することも、field_overrides を使用して特定のフィールドに適用することもできます。

{
  "field_suffixes": [
    {
      "suffix": "SUFFIX_STRING",
      "modifier": {
        "format_date": {
          "formats": [
            {
              "size": FIELD_SIZE,
              "pattern": "FORMAT_PATTERN"
            }
          ]
        }
      }
    }
  ]
}

次のリストでは、構成プロパティについて詳しく説明します。

  • suffix: 名前が -SUFFIX_STRING または _SUFFIX_STRING で終わるコピーブック フィールドに一致します(大文字と小文字は区別されません)。suffix の先頭にハイフンまたはアンダースコアが含まれていないことを確認してください。または、"field": "FIELD_NAME" で field_overrides を使用して、個々のフィールドをターゲットにします。
  • format_date / format_timestamp: フィールドの解析またはフォーマットに使用される修飾子を定義します。
    • format_date は、サイズ指定された文字列フィールド(PIC X)または整数数値フィールド(PIC 9(n)、COMP、COMP-3 など。スケールは 0、精度は最大 18。フォーマット前に符号なし文字列表現に動的に変換されます)に適用できます。
    • format_timestamp は、サイズ指定された文字列フィールド(PIC X)に適用できます。タイムスタンプは、パターンにタイムゾーンまたはオフセットが含まれていない限り、UTC で解釈されます。
  • formats: DateTimeFormat オブジェクトのリスト。各オブジェクトは次のものを指定します。
    • size: パターンが適用されるフィールドのサイズ(文字列フィールドのバイト長、または数値フィールドの精度)。
    • pattern: 日付またはタイムスタンプのパターン。デコード(qsam decode)中、フィールドのサイズに一致する形式が、一致するまで順番に評価されます。エンコード(qsam encode)中は、フィールドのサイズに一致する最初の形式のみが使用されます。有効な形式の詳細については、サポートされている日付とタイムスタンプの形式をご覧ください。
  • 接尾辞の削除(省略可): 出力フィールド名から -SUFFIX_STRING または _SUFFIX_STRING を削除するには、トランスコーダ構成の transformations 配列に rename 変換を追加します。

例

  • -DT8 または _DT8 で終わる 8 バイトのフィールドを、パターン yyyyMMdd を使用して DATE としてフォーマットし、-DT または _DT で終わる 10 バイトのフィールドを MM-dd-yyyy または MM/dd/yyyy でフォーマットするには、次のようにします。

    {
      "field_suffixes": [
        {
          "suffix": "DT8",
          "modifier": {
            "format_date": {
              "formats": [
                {
                  "size": 8,
                  "pattern": "yyyyMMdd"
                }
              ]
            }
          }
        },
        {
          "suffix": "DT",
          "modifier": {
            "format_date": {
              "formats": [
                {
                  "size": 10,
                  "pattern": "MM-dd-yyyy"
                },
                {
                  "size": 10,
                  "pattern": "MM/dd/yyyy"
                }
              ]
            }
          }
        }
      ]
    }
    
  • -TIMESTAMP、_TIMESTAMP、-TS、_TS で終わる 26 バイトのフィールドを、パターン yyyy-MM-dd HH.mm.ss.SSSSSS を使用して TIMESTAMP としてフォーマットし、出力列名からサフィックスを削除するには、次のようにします。

    {
      "field_suffixes": [
        {
          "suffix": "TIMESTAMP",
          "modifier": {
            "format_timestamp": {
              "formats": [
                {
                  "size": 26,
                  "pattern": "yyyy-MM-dd HH.mm.ss.SSSSSS"
                }
              ]
            }
          }
        },
        {
          "suffix": "TS",
          "modifier": {
            "format_timestamp": {
              "formats": [
                {
                  "size": 26,
                  "pattern": "yyyy-MM-dd HH.mm.ss.SSSSSS"
                }
              ]
            }
          }
        }
      ],
      "transformations": [
        {
          "rename": {
            "find": "^(.*)[-_](TIMESTAMP|TS)$",
            "replace": "$1"
          }
        }
      ]
    }
    

null インジケーターのサポート

Mainframe Connector は、トランスコーダ構成(--transcode-configuration)の null_if フィールド修飾子を介して null インジケーターをサポートします。

接尾辞ベースの null インジケーター(COL1-NID などのフィールドが同じレコード内の COL1 の null インジケーターとして機能する)を構成するには、"is_inverse": true と "target_field": "$self" を使用して field_suffixes にエントリを定義します。

{
  "field_suffixes": [
    {
      "suffix": "NULL_INDICATOR_NAME",
      "is_inverse": true,
      "modifier": {
        "null_if": {
          "target_field": "$self",
          "null_value": "NULL_VALUE",
          "non_null_value": "NOT_NULL_VALUE"
        }
      }
    }
  ]
}

次のリストは、null インジケーターの構成に使用できるパラメータを示しています。

  • suffix: コピーブックの null インジケーター フィールドを識別する接尾辞 -NULL_INDICATORNAME または NULL_INDICATOR_NAME に対応します。
  • is_inverse: FieldSuffix で true に設定すると、修飾子は、名前が接尾辞のないインジケーター フィールドと一致する兄弟フィールドに適用されます(たとえば、インジケーターが COL1-NID1 の場合は COL1)。"$self" はインジケーター フィールド自体を指します。field_overrides を使用して特定のフィールドに null_if を直接適用し、target_field をインジケーター フィールドの名前に設定することもできます。
  • null_value または null_values: 参照先のフィールドが null であることを示す target_field の単一の値(null_value)または値のリスト(null_values)を指定します。
  • non_null_value または non_null_values: (省略可)target_field の単一の値(non_null_value)または値のリスト(non_null_values)を指定して、参照先のフィールドが null ではないことを示します。省略すると、null_value または null_values 以外の値は null 以外として扱われます。null_value(s) または non_null_value(s) の少なくとも 1 つを指定する必要があります。
  • null インジケーター フィールドの除外または保持: デフォルトでは、null インジケーター フィールドは出力スキーマの列として保持されます。トランスコード中に null インジケーター フィールドを使用しながら、出力テーブルから null インジケーター フィールドを省略するには、transformations 配列のインジケーター フィールドに exclude 変換を追加します(filler はフィールドのデコードを完全にスキップするため、null インジケーター フィールドに filler 修飾子を適用しないでください)。
  • インジケーター フィールド タイプのオーバーライド:(省略可)null インジケーター フィールドを bytes または binary としてデコードするには、"modifier": { "bytes": {} } または "modifier": { "binary": {} } を使用して、インジケーター フィールドに非逆 field_suffixes(または field_overrides)ルールを追加します。bytes の場合、null_value と non_null_value を 16 進数の文字列("FF" や "00" など)で表します。

例

次の例では、COL1-NID1 と FIELD-NID2 は null インジケーターとして評価された後、出力テーブルから除外されますが、COL2-NULL は出力スキーマに保持されます。

コピーブック スニペット:

01 REC.
   10 COL1-NID1 PIC S9(4) USAGE COMP.
   10 COL1      PIC S9(6) USAGE COMP.
   10 FIELD     PIC X(10).
   10 FIELD-NID2 PIC X(1).
   10 COL2      PIC X(10).
   10 COL2-NULL PIC X(1).

Transcoder の構成(transcode-configuration.json):

{
  "field_suffixes": [
    {
      "suffix": "NID1",
      "is_inverse": true,
      "modifier": {
        "null_if": {
          "target_field": "$self",
          "null_value": "-1",
          "non_null_value": "0"
        }
      }
    },
    {
      "suffix": "NID2",
      "is_inverse": true,
      "modifier": {
        "null_if": {
          "target_field": "$self",
          "null_value": "?"
        }
      }
    },
    {
      "suffix": "NULL",
      "is_inverse": true,
      "modifier": {
        "null_if": {
          "target_field": "$self",
          "null_value": "?"
        }
      }
    }
  ],
  "transformations": [
    {
      "exclude": {
        "field": "COL1-NID1"
      }
    },
    {
      "exclude": {
        "field": "FIELD-NID2"
      }
    }
  ]
}

DBCS フィールドのサポート

DBCS フィールド(PIC G または PIC N と USAGE DISPLAY-1)を使用する場合は、次の点を確認してください。

  • PIC G フィールドには USAGE DISPLAY-1 を明示的に指定する必要があります。
  • USAGE 句のない PIC N フィールドは、デフォルトで USAGE NATIONAL(UTF-16BE)になります。PIC N フィールドを DBCS フィールドとして扱うには、コピーブックで USAGE DISPLAY-1 を指定します(または、トランスコーダ構成でエンコードをオーバーライドします)。
  • デフォルトでは、USAGE DISPLAY-1 フィールドは cp300(x-IBM300)DBCS 文字セットを使用してデコードおよびエンコードされます。この文字セットでは、シフトアウト(0x0E)制御文字とシフトイン(0x0F)制御文字のない未加工の DBCS バイトが想定されます。
  • 別の DBCS 文字セット(Cp834 など)またはシフトアウト(0x0E)バイトとシフトイン(0x0F)バイトを使用するマルチバイト文字セット(MBCS)(x-IBM930、x-IBM933、x-IBM935、x-IBM937、x-IBM939、x-IBM942、x-IBM942C、x-IBM943、x-IBM943C、x-IBM949、x-IBM949C、x-IBM950、x-IBM964、x-IBM970、x-IBM1364 など)を使用するには、トランスコーダ構成(--transcode-configuration)で string フィールド修飾子を構成します。

defaults.dbcs を使用してすべての USAGE DISPLAY-1 フィールドに DBCS エンコードをグローバルに設定することも、field_overrides または field_suffixes を使用して特定のフィールドに設定することもできます。

{
  "defaults": {
    "dbcs": {
      "string": {
        "encoding": "x-IBM930"
      }
    }
  }
}

可変長文字列のサポート

コピーブック パーサーは、トランスコーダ構成の varlen フィールド修飾子を使用して、可変長文字列グループ フィールドをサポートします。

10 VAR-GRP.
   15 VAR-LEN  PIC 9(4) USAGE COMP.
   15 VAR-TEXT PIC X(50).

varlen フィールド修飾子を使用する場合は、次の点を確認してください。

  • トランスコーダ構成で field_overrides または field_suffixes を使用して、グループ アイテム(VAR-GRP など)に varlen 修飾子を適用します。

    {
      "field_overrides": [
        {
          "field": "VAR-GRP",
          "modifier": {
            "varlen": {}
          }
        }
      ]
    }
    
  • グループ アイテムには、2 つのサブフィールドを含める必要があります。

    1. 最初のサブフィールドは、文字列データのバイト長を指定する 64 ビット整数(LONG、バイナリ COMP やゾーン 10 進整数フィールドなど)にデコードする必要があります。
    2. 2 番目のサブフィールドは、変更されていない文字列フィールド(PIC X(n)、PIC N(n)、PIC U(n) など)にする必要があります。
  • 特定のサブフィールド接尾辞(-LEN や -TEXT など)は必要ありません。出力スキーマの結果の列には、グループ項目(VAR-GRP)の名前が使用されます。

サポートされていないフィールドと構造

以降のセクションでは、コピーブック パーサーでサポートされていないフィールドと構文について説明します。

サポートされていない COBOL 構文

コピーブック パーサーは、次の COBOL 構文を解析できます。ただし、これらの構文はサポートされていません。これらの構文をコピーブックで使用すると、Mainframe Connector でエラーが表示されます。

  • ALIGNED
  • BLANK WHEN ZERO
  • COMMON、OWN、LOCAL
  • DYNAMIC LENGTH(PIC X DYNAMIC LENGTH、PIC U DYNAMIC LENGTH LIMIT n など)
  • INTEGER、STRING
  • JUSTIFIED
  • OCCURSにある「ASCENDING/DESCENDING KEY」
  • OCCURSにある「INDEXED BY」
  • RECEIVED BY
  • RECORD AREA
  • RENAMES
  • SYNCHRONIZED/SYNC
  • THREAD-LOCAL
  • TYPE IS ...
  • TYPEDEF
  • USING LANGUAGE/CONVENTION

サポートされていないデータ型

次の USAGE タイプは文法で解析できますが、コピーブック コンパイラではサポートされていません。

  • BIT
  • CONTROL-POINT
  • DATE
  • DOUBLE
  • EVENT
  • FUNCTION-POINTER
  • INDEX
  • KANJI
  • LOCK
  • POINTER
  • PROCEDURE-POINTER
  • REAL
  • SQL
  • TASK