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-5COMP-3、COMPUTATIONAL-3、PACKED-DECIMALCOMP-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 つのサブフィールドを含める必要があります。
- 最初のサブフィールドは、文字列データのバイト長を指定する 64 ビット整数(
LONG、バイナリCOMPやゾーン 10 進整数フィールドなど)にデコードする必要があります。 - 2 番目のサブフィールドは、変更されていない文字列フィールド(
PIC X(n)、PIC N(n)、PIC U(n)など)にする必要があります。
- 最初のサブフィールドは、文字列データのバイト長を指定する 64 ビット整数(
特定のサブフィールド接尾辞(
-LENや-TEXTなど)は必要ありません。出力スキーマの結果の列には、グループ項目(VAR-GRP)の名前が使用されます。
サポートされていないフィールドと構造
以降のセクションでは、コピーブック パーサーでサポートされていないフィールドと構文について説明します。
サポートされていない COBOL 構文
コピーブック パーサーは、次の COBOL 構文を解析できます。ただし、これらの構文はサポートされていません。これらの構文をコピーブックで使用すると、Mainframe Connector でエラーが表示されます。
ALIGNEDBLANK WHEN ZEROCOMMON、OWN、LOCALDYNAMIC LENGTH(PIC X DYNAMIC LENGTH、PIC U DYNAMIC LENGTH LIMIT nなど)INTEGER、STRINGJUSTIFIEDOCCURSにある「ASCENDING/DESCENDING KEY」OCCURSにある「INDEXED BY」RECEIVED BYRECORD AREARENAMESSYNCHRONIZED/SYNCTHREAD-LOCALTYPE IS ...TYPEDEFUSING LANGUAGE/CONVENTION
サポートされていないデータ型
次の USAGE タイプは文法で解析できますが、コピーブック コンパイラではサポートされていません。
BITCONTROL-POINTDATEDOUBLEEVENTFUNCTION-POINTERINDEXKANJILOCKPOINTERPROCEDURE-POINTERREALSQLTASK