IMPORT - Basic Teradata Query

Basic Teradata Query リファレンス

Product
Basic Teradata Query
Release Number
16.20
Published
2018年4月
Language
日本語
Last Update
2019-07-11
dita:mapPath
ja-JP/kil1527114222313.ditamap
dita:ditavalPath
ja-JP/kil1527114222313.ditaval
dita:id
B035-2414
Product Category
Teradata Tools and Utilities

目的

この制御によって、ユーザーは、後続のSQLリクエストのUSING修飾子で処理するレコード データがあるファイルとその形式を指定できます。

構文

次の図は、メインフレーム接続システムとワークステーション接続システムの構文を示します。





次のような場合に当てはまります。

AXSMOD
アクセス モジュールを使用してデータをインポートすることを示します。 このオプションは、ワークステーション接続システムのDATAおよびINDICDATA型に対してのみ有効です。

インポート ファイルがオープンされると、BTEQは、使用されているセッション文字セットに応じて、以下の属性の1つ以上をアクセス モジュールに対して設定します。

  • CHARSET_NAME
  • CHARSET_NUMBER
  • BYTE_ORDER
character
この構成要素はオプションのフィールド区切り記号で、VARTEXTレコード内で列の区切りに使用する文字を定義します。必ず単一引用符で囲みます。ワークステーション接続システムのUnicodeセッションでは、マルチバイト文字を使用できます。メインフレーム接続システム上のUnicodeセッションでマルチバイト区切り記号が必要な場合は、16進数のシーケンスを使用します。

区切り記号が指定されていない場合、BTEQはすべてのVARTEXTフィールドが縦棒'|'文字で区切られていると見なし、その文字はASCIIでは0x7C、TD_EBCDICでは0x6A、UnicodeではU+007Cにそれぞれ相当します。

DATA
INDICDATA
REPORT
BTEQによって読み込まれるデータの形式。

DATAまたはINDICDATAが指定されていると、読み取るデータはFastLoad形式、つまりBTEQ EXPORT DATAコマンド、BTEQ EXPORT INDICDATAコマンド、またはFastExportなどによって生成された形式であることが必要です。

IMPORTコマンドのINDICDATAオプションをSET INDICATORMODEコマンドやSET INDICDATAコマンドとして使用することはできません。

REPORT形式が指定されていると、読み取るデータは EXPORT REPORTコマンドによって生成された形式であることが必要です。

REPORTWIDEキーワードも利用できます。 このキーワードは、データにREPORT形式を使用する必要があることを指示し、WIDTH設定を32765に変更します。 このキーワードは廃止予定であるため、代わりにSET WIDTHコマンドを使用します。

ddname
データを読み取るメインフレーム接続システムのファイルを定義した、z/OS JCLのDD文の名前。
メインフレーム接続システムの場合、DDNAMEの代わりにFILEを使用できます。ただし、このFILEは、ファイルの概念ではなくデータ定義の概念を表わすので、注意して使用することが必要です。
DEFERCOLS
USING句でAS DEFERREDにより定義されたラージ データ オブジェクト(LDO)列の数。 この数には、USING句でAS DEFERRED BY NAMEにより定義されたLDO列の数を含めることはできません。

AS DEFERREDで定義された列は、USING句の最初にリストされる必要があります。

DEFERCOLSオプションに指定できる最大値は、Teradata DatabaseによりUSING句でサポートされる列の最大数に基づきます。

キーワードLOBCOLSはDEFERCOLSの別名です。 いずれも機能的には同じです。

DEFERLIMITS
潜在的なパフォーマンスの向上として、Teradata Databaseバージョン15.10以降を使用している場合、USING句にAS DEFERRED修飾子で定義されている際にBTEQはLDOを遅延なしで転送できます。DEFERLIMITSオプションを使用して、BTEQが列の遅延した転送を上書きする方法とタイミングを制御する制限設定を調整できます。最大のパフォーマンスを実現するため最適な制限を指定するのはユーザー次第です。

このオプションは、データベースへのLDOの送信に遅延転送を使用した場合と非遅延転送を使用した場合の制限を示します。このオプションには2つの引数があります。第1引数は各LDOの制限(バイト単位)を定義します。第2引数は、現在のレコードの非遅延LDOバイトすべての累積制限を定義します。LDOを非遅延転送として送信するには、両方の制限内にある必要があります。各制限を超えた場合、遅延転送になります。

両方のDEFERLIMITS引数の有効な値は0..7340032です。2番目の値は最初のものより小さくできません。最大値は、データベースの要求メッセージの制限に基づいています。

非遅延LDO転送は、"0,0"を使用すると完全にオフにできます。

このオプションが指定されておらずDEFERCOLSオプションが指定されている場合、DEFERLIMITSには次のデフォルト値が使用されます。
  • 0,0 – 1より大きいPACK係数が存在する場合。これにより、非遅延LDO転送が無効化され、パックされるレコードの平均数は影響を受けません。
  • 1000,10000 – PACK係数が0または1である場合。非遅延LDO転送を行なう場合、サイズは1,000バイト以下である必要があります。すべての非遅延LDO転送(それ自身を含む)のバイト総数は、指定レコードで10,000バイト以下である必要があります。

DEFERCOLSオプションが必要とされIMPORTコマンドに指定される必要があります。

filename
データを読み取るワークステーション接続システムのファイルの名前。

ファイル名の中にカンマ、セミコロン、空白がある場合には、ファイル名全体を単一引用符か二重引用符で囲みます。

ファイル名の大文字と小文字は、UNIXのシステムでは区別されます。Windowsのシステムでは区別されません。

Windows環境でファイル名に続けて他のコマンド オプションを指定する場合には、ファイル名を単一引用符または二重引用符で囲まなければなりません。

ワークステーション接続システムのFILEの代わりにDDNAMEを使用できます。 これはDDNAMEの概念ではなくFILEの概念を表わすことに注意してください。

'HEX sequence' xb
Unicodeセッションのみで、VARTEXTレコード内で列の区切りに使用する、単一の文字区切り記号の16進数表現を指定します。これは単一引用符で囲む必要があり、末尾に"xb"または"XB"を含みます。16進数(0~9、a~f、A~F)は、セッション文字セットのエンコーディング内で有効な文字を表わす必要があります。これは特に、Unicodeセッションでもすべての入力がEBCDICに基づくメインフレーム接続システムで便利です。例えばセッション文字セットがUTF-16BEの場合、'FFE5'xbを使用して区切り記号を全角円記号('¥')として表わすことができます。

区切り記号が指定されていない場合、BTEQはすべてのVARTEXTフィールドが縦棒'|'文字で区切られていると見なし、その文字はASCIIでは0x7C、TD_EBCDICでは0x6A、UnicodeではU+007Cにそれぞれ相当します。

'init-string'
インポート プロセスの開始時にアクセス モジュールに渡されるオプションの開始文字列の名前。文字列は単一引用符で囲む必要があります。
Messages=RECORDNUMBERS
使用すると、インポート中にどのインポート ファイル レコードが受け入れられ、拒否されたかを反映するメッセージをBTEQが出力します。 各メッセージに含まれるレコード番号は、インポート ファイル内の連続する位置を表わす1ベースのオフセットです。 そのため、これらのメッセージはフォローアップ アクションを必要とする拒否されたレコードの場所を判断するために役立ちます。

レコード メッセージの生成がインポートのために要求され、USING節に関連付けられたSQL文が成功すると、BTEQは"accepted"形式のレコード番号メッセージを生成します。 次に例を示します。

*** Insert completed. One row added.
*** Accepted Import Record# 4

ただし、ステートメントが成功しない場合、BTEQは"rejected"形式のレコード番号メッセージを生成します。 次に例を示します。

*** Statement Error 2802 Duplicate row error in MyUser.MyTable.
               Statement# 1, Info =0 
*** Rejected Import Record# 1 

要求レベルの障害またはエラーが原因でステートメントが失敗し、要求のUSINGデータ用に複数のインポート レコードがパックされていてすべてのレコードを拒否する必要がある場合、パックされた各レコードはその後、生成された独自のレコード番号メッセージを持ちます。 次に例を示します。

*** Failure 2673 The source parcel length does not match data that was defined.
               Statement# 3, Info =4
*** Rejected Import Record# 6
*** Warning: All packed records for the request were rejected.
             The other record number message(s) follow.
*** Rejected Import Record# 4
*** Rejected Import Record# 5
modname
アクセス モジュール ライブラリ名。名前に空白文字が含まれている場合は、単一引用符で囲んでください。ライブラリが見つからない場合やロードされているバージョンが正しくない場合は、完全修飾パス名を使用します。
例えば、次のように指定できます。 ' /opt/teradata/client/xx.xx/lib/np_axsmod.so '
64ビットBTEQを使用している場合は、アクセス モジュールも64ビット モードで作成する必要があります。64ビット モードで作成するために使用するコンパイラ オプションについては、NOTIFYコマンドの説明の「出口モジュールの作成」を参照してください。
RECORDLENGTH
現在のインポートに対するサイズ制限の定義。これにより、インポートの間、現在のインポート関連のRECORDLENGTHコマンド設定が上書きされます。

RECORDLENGTHオプションの有効な引数は次のとおりです。

  • MAX64 – レコード サイズを64,768バイトに制限します。DATA/INDICDATAインポートの場合、インポート ファイル内の各レコードは2バイトのレコード長で開始されると想定されます。
  • MAX1MB – レコード サイズを1,024,000バイトに制限します。DATA/INDICDATAインポートの場合、インポート ファイル内の各レコードは4バイトのレコード長で開始されると想定されます。

DATA/INDICDATAインポート ファイルには、同じサイズのレコード長が含まれている必要があります。2バイト長のレコードと4バイト長のレコードを混在させると、予期しない動作が発生します。

REPORT/VARTEXTではレコード長は関係しないため、このオプションはREPORT/VARTEXTのインポートには影響しません。

エクスポートしたデータを後でインポートするときに、RECORDLENGTHオプションの設定が一致する必要があります。一致しない場合、インポートは失敗します。

このオプションを指定しないと、BTEQは現在のインポート関連のRECORDLENGTHコマンド設定から値を取得します。RECORDLENGTHコマンドが以前に送信されていない場合は、デフォルト値のMAX64が使用されます。

SHOW CONTROLS IMPORTコマンドを送信して、現在のインポートでRECORDLENGTHの上書きが有効かどうかを確認します。有効でない場合は、SHOW CONTROLS RECORDLENGTHコマンドを送信して親の設定を表示します

RESET
インポートを終了します。 インポート・ファイルが閉じます。
SKIP =n
データを読み取る前にスキップする、ファイルの初めからの行数。 デフォルト値は、ゼロです。 有効な数値の範囲は、0~2147483647です。
TOTCOLS
要求のUSING句で参照される列の総数。これには、すべてのLDO列およびLDO以外の列の数を含みます。TOTCOLSキーワードは、USING句にAS DEFERREDで定義されているLDOを含むINDICDATA形式のインポート データ レコードに対してのみ有効です。

DEFERCOLSオプションに指定できる最大値は、Teradata DatabaseによりUSING句でサポートされる列の最大数に基づきます。

VARTEXT
それぞれのフィールドを区切り文字で分離する、可変長文字フィールドとしてのレコード形式。

使用上の注意

メインフレーム接続システムの場合、BTEQは、固定長、可変長、または未定義長レコード形式のすべてのシーケンシャル ファイルをサポートしています。

インポート操作で処理されるデータのレコード長が252バイトより長い場合には、バッファ サイズを大きくしたことを示す次のようなメッセージが表示されます。

Growing buffer to 32000

キーワードのDATAとINDICDATAは、Teradata Databaseに送信されるデータの形式を示します。

DATA形式は、レコード モードで使用され、この場合にNULLを示す標識ビットは送られません。 INDICDATA形式は、標識モードで使用され、この場合にはNULLを示す標識ビットが送られます。

KANJISJIS_0S、KANJIEUC_0U、TCHBIG5_1R0、およびSDTCHBIG5_3R0の文字セットの場合、デフォルトは、フィールド モードではなくレコード(データ)モードです。

Teradata SQLマクロでは、IMPORTコマンドを使用しないでください。

前のEXPORTコマンドですでに開いているファイルを指定することは推奨しません。 レコードが同時に読み書きされることにより予期しない結果が生じることがあります。

SQLリクエストのUSING句を使用してインポートするデータ レコードを正しく記述するのはユーザーの責任になります。
複文リクエストでUSING句を使用する場合、最初のステートメントを開始する必要があります。 そうしないとUSING句が認識されず、要求とともにデータ パーセルが送られずデータベース構文エラーとなります。
デフォルトではUSING句を含む要求は最大n個のレコードを処理できます。ここでnはREPEATおよびPACK係数の現在の値に依存し、インポート ファイルが開いていて未読み込みのレコードを含む必要があります。 詳細はこの章のPACKおよびREPEATコマンドを参照してください。
IMPORTコマンドの現在のレコード形式については、SHOW CONTROLSコマンドで表示することができます。
Unicodeセッションでは、インポート ファイルのエンコードがセッション文字セットのエンコードに一致していなければなりません。

単文SQLリクエストは、要求とともにパックされたUSINGデータ インポート レコードの数だけ反復されます。そのため、反復された要求に対してレコード番号メッセージが生成されると、結果として得られる各ステートメントのメッセージには、異なるレコード番号の消費が反映されます。ただし、複文リクエストに対してレコード番号メッセージが生成される場合、ステートメントのセット用に生成されるレコード番号メッセージは、すべて同じインポート レコードの消費を反映します。アクティブなREPEAT係数が1より大きく、消費するインポート レコードがまだ残っている場合、要求は次のUSINGデータ インポート レコードで再送信されます。後続のステートメントのメッセージは、この場合もすべて消費されている同じレコード番号を反映します。ただし、前の要求のメッセージが反映したものとは異なるレコードになります。

レコード番号メッセージの形式と語法は、テキストが後処理アクションの一部として使用される可能性があるため、変更されることはありません。

レコード番号の最大値は18446744073709551615です。その番号がレコードの追跡に使用された後は、BTEQはもう一度番号"1"から使用します。ロールオーバーが発生するたびに警告が生成されます。

DATAおよびINDICDATAキーワード

ワークステーション接続システム

キーワードDATAまたはINDICDATAを使用した場合は、各レコードは以下の形式になります。

  • レコードは、2バイトまたは4バイトの長さフィールドで始まる。このフィールドには、レコード内のバイト数を表わす2進数の符号なし整数値が入っている。この値には、長さフィールドの2バイトとレコード終了フィールドの1バイトは含まれない。2バイトのレコード長のフィールドでは、RECORDLENGTHオプションの値はMAX64でなければなりません。4バイトのレコード長のフィールドでは、RECORDLENGTHオプションの値はMAX1MBでなければなりません。
  • 2進数で表現されたフィールドが続く。このフィールドには、返された行の列値が、レコード形式または標識形式で入っている。
  • レコードは、レコード終わりインディケータで終わる。このインディケータは、ワークステーションおよびオペレーティング システムに対応する。 例えば、UNIXシステムの場合、インディケータは新しい行になる。 Windowsでは、インディケータは復帰/改行の対で構成される。 すべての場合、レコード終わり文字(複数も可)は、ワークステーションに対応する文字コードで入っている。 例えば、ASCIIワークステーションであればASCIIコードで入っている。
REPORT形式のエクスポート ファイルを使用して数値データを再びインポートすると、数値データ フィールドが壊れます。

異なるプラットフォーム タイプに対するIMPORTコマンドのソースとして、BTEQのEXPORTコマンドを使ってエクスポートしたファイルを使う場合、両方のプラットフォームのエンディアン タイプが同じであることを確認してください。 これはSHOW CONTROLS BYTE ORDERコマンドを使用して確認できます。

メインフレーム接続システム

キーワードDATAまたはINDICDATAを使用した場合は、レコードは、選択行の列値がレコード形式または標識形式で含まれている、バイナリ形式のフィールドで構成されている必要があります。 レコードの長さフィールドまたはレコード終了インディケータは含まれません。その情報はz/OSがレコードを格納する方法で固有となるためです。

ワークステーション接続システムおよびメインフレーム接続システムでは、Unicodeセッション文字セットが使用されている場合、DATA(またはINDICDATA)インポート ファイルの最初にBOMを使用することはできません。

ラージ データ オブジェクト(LDO)のインポート

ラージ データ オブジェクト(LDO)は、CLOB、BLOB、XMLおよびJSONのデータ型で構成されます。 LDOは、インライン、遅延転送、非遅延転送のいずれかでBTEQからデータベースに送信できます。 どのように送信されるかは、DEFERCOLS、TOTCOLS、およびDEFERLIMITSオプションの使用により異なります。

次の箇条書きセクションでは、LDOがどのように転送できるかを比較します。

インライン転送用のLDO
  • SQLリクエストのUSING句で、AS DEFERREDまたはAS DEFERRED BY NAME修飾子で記載されていません。
  • SQLリクエストとともにデータベースに送信されます。 実際の値は、LDO以外の列値とともにメインのインポート データ ファイルに格納されます。
  • FastLoad形式の全長標識インディケータによって制限されます。2つ以上の列が各インポート レコードに転送される場合、少なくなります。全体的な長さの識別子は、現在のインポートRECORDLENGTH設定に応じて、64KBまたは1MBに制限されます。各LDOは、それらの値の前にインポート レコードで(2バイトではなく)8バイトの長さ標識を保持する必要があります。そうでない場合、2バイトの長さ標識を要求する別のデータ型が、USING句で使用される必要があります。例えば、CLOBではなくVARCHARです。
  • 転送関連のIMPORTコマンド オプションのいずれかの使用は要求されません。しかし、FastLoad形式オプションにDATAまたはINDICDATAを使用してのみ指定できます。
遅延転送用のLDO
  • SQLリクエストのUSING句で、AS DEFERREDまたはAS DEFERRED BY NAME修飾子で記載されています。
  • データを各LDOファイルに格納します。 これらのファイルの名前は、メインのインポート データ ファイルにVARCHAR型値を使用して指定する必要があります。 LDOファイル名の最大サイズは1024バイトです。 各LDOは、SQLリクエストを受信した後、データベースにより個別に引き出されます。
  • 2GBのサイズに制限されます。
  • AS DEFERRED列には、DEFERCOLS (またはTOTCOLS)オプションが使用される必要があります。 転送に関係のないIMPORTコマンド オプションは、AS DEFERRED BY NAME列に使用される必要があります。
可能性のある非遅延転送のLDO
  • AS DEFERRED修飾子でのみ記載でき、SQLリクエストのUSING句で最初にリストする必要があります。
  • データを各LDOファイルに格納します。 これらのファイルの名前は、メインのインポート データ ファイルにVARCHAR型値を使用して指定する必要があります。 LDOファイル名の最大サイズは1024バイトです。 LDOは、インポート要求に十分なスペースがありDEFERLIMITS値を超過しないことを前提に、SQLリクエストが受信された後、データベースにより個別に引き出されるのではなく、SQLリクエストといっしょにデータベースに送信されます。 これにより、BTEQおよびデータベース間で送信されるパーセルの数を減少させることができ、パフォーマンスを向上できます。
  • 非遅延LDOおよびLDO以外のデータの合計サイズは、インポート要求につき約1MBに制限されます。
  • DEFERCOLSオプションおよびDEFERLIMITSインポート設定の組み合わせまたはDEFERCOLSオプションおよびPACK係数の組み合わせにより、どのLDOが遅延なしに転送されるかを決定します。TOTCOLSオプションは、INDICDATA形式を使用する場合、指定する必要があります。

単一のインポートは、AS DEFERRED修飾子およびAS DEFERRED BY NAME修飾子の両方により定義されたLDOを含めることができます。 このような場合は、AS DEFERRED BY NAME列をDEFERCOLS値に含めません。 例えば、インポートに3つのAS DEFERRED列および2つのAS DEFERRED BY NAME列が含まれる場合、DEFERCOLS=3を使用します。

AS DEFERRED修飾子で定義されたLDOは、USING句で最初にリストされる必要があります。 AS DEFERRED列の後にUSING句のどこにでもAS DEFERRED BY NAME列を指定できます。

BTEQは、遅延および非遅延LDOインポートをDATA、INDICDATAおよびVARTEXT形式でサポートしていますが、REPORT形式ではサポートしていません。 LDOをエクスポートする場合、遅延および非遅延インポートは、INDICDATA形式でのみ可能です。

AS DEFERRED修飾子で定義されているLDOを使用する場合、要求をデータベースに送信する前に、BTEQはVARCHARファイル名の値を4バイトの整数トークンに置き換えます。 シングル バイトのファイル名が指定された場合、3バイト(2バイトはVARCHAR値の長さ、1バイトはファイル名値の長さ)が4バイトに置き換えられます。 この置換により、インポート データ レコードの全体サイズが大きくなりすぎて、生成されるすべてのトークンを正常に含めることができない可能性があります。

z/OS BTEQを使用して遅延および非遅延のLDOインポートを実行する場合は、インポート データ レコードに完全修飾のデータ セット名が含まれていなければなりません。データ セットには、シーケンシャルなデータ セットか、USERID.CLOB.DATA1やUSERID.CLOB(DATA)などのPDSメンバーを指定できます。

非遅延LDO転送(DEFERLIMITSオプションを使用)は、PACK設定が1より大きい場合に、パックされたレコードの有効性を変える場合があります。非遅延LDOはパックされたレコードとともにデータベースに渡される一方、遅延LDOは後から送信されます。なお、経過時間により決まりますが、非遅延転送による小さなLDOのインポートは遅延転送に比べてパフォーマンスに優れる場合があります。いくつかのテストおよびチューニングは、LDOを含むレコードをインポートする最適な方法を決定するために必要な場合があります。パフォーマンス低下の影響がある場合は、"DEFERLIMITS=0,0"を入力して非遅延転送を完全に無効にできます。

次のテーブルは、PACK設定に関連して使用されるDEFERLIMITSの値を示します。

PACK設定 DEFERLIMITSオプション(デフォルトまたは指定) 実際の
パックされたレコード 各LDOの最大バイト数 1レコードの累積的なLDOバイト数
0または1 デフォルト(オン) 1 1,000 10,000
0または1 ユーザー指定 1 ユーザー定義 ユーザー定義
2+ デフォルト(オフ) 1..PACK 0 0
2+ ユーザー指定 1..PACK ユーザー定義 ユーザー定義

DEFERLIMITSオプションを使用してもLDOが非遅延転送として送信されることは保障されません。 指定される引数、LDOファイルのサイズ、LDO列がUSING句でAS DEFERREDまたはAS DEFERRED BY NAMEで定義されるかに影響を受けます。

次の例では、これが機能していることを示します。USING句に6つのCLOBがあり3レコードがインポートされると仮定します。DEFERLIMITSオプションは"2000,5000"に設定します。使用されているUSING句修飾子およびLDOサイズに基づいてBTEQがどのように各LDOを取り扱うかに注意してください。

Record 1
   AS DEFERRED          (1000 bytes)   Non-deferred
   AS DEFERRED          (500 bytes)    Non-deferred
   AS DEFERRED          (1000 bytes)   Non-deferred
   AS DEFERRED          (500 bytes)    Non-deferred
   AS DEFERRED          (1000 bytes)   Non-deferred
   AS DEFERRED BY NAME  (500 bytes)    Deferred
Record 2
   AS DEFERRED          (3000 bytes)   Deferred
   AS DEFERRED          (1000 bytes)   Non-deferred
   AS DEFERRED          (6000 bytes)   Deferred
   AS DEFERRED          (2000 bytes)   Non-deferred
   AS DEFERRED          (5000 bytes)   Deferred
   AS DEFERRED BY NAME  (1000 bytes)   Deferred
Record 3
   AS DEFERRED          (1000 bytes)   Non-deferred
   AS DEFERRED          (2000 bytes)   Non-deferred
   AS DEFERRED          (2000 bytes)   Non-deferred
   AS DEFERRED          (1000 bytes)   Deferred
   AS DEFERRED          (2000 bytes)   Deferred
   AS DEFERRED BY NAME  (1200 bytes)   Deferred

DEFERLIMITSオプションが指定されたとき、BTEQは各インポートの遅延および非遅延LDO転送の数を表示します。 次のようなメッセージが表示されます。

*** Total LDOs: 50, Non-deferred: 18, Deferred: 32

複数セッションを使用して、要求を並行処理するデータベースの能力を活用できます。

BTEQでは最大200セッションを使用できます。 しかし、各セッションはシステムのリソースを超える専用のファイル ハンドルを必要とします。 BTEQがファイルをオープンできない場合、関連する要求はアボートされます。 このため、使用するセッションの適切な数は、実働環境でLDOインポート ジョブを実行する前に決定する必要があります。

注:
  • Unicodeセッションを使用したAS DEFERRED列の転送はサポートされていません。
  • Teradata Databaseは、現在USING句内のJSONキーワードをサポートしていません。 JSONデータをインポートする場合、USING句内で列をCLOBタイプとして定義します。
  • 遅延モードまたは非遅延モードでインポートされるz/OS BTEQ、テキストLDOは、レコード終了インディケータ(新しい行文字)を含めません。

REPORTキーワード

REPORTを指定する場合には、BTEQ EXPORTコマンドのREPORTキーワードによって生成される形式になっていなければなりません。ただし、一定のレコードを削除する必要があります。 例えば、タイトル テキストとタイトル ダッシュはエディターを使用して手動で削除できます。あるいは、SKIPオプションを使用してプログラムで無視することができます。

ワークステーション接続システムでは、各レコードはレコード終わりインディケータで終わらなければなりません。これは使用されているセッション文字セットとBTEQを実行しているプラットフォームに適していなければなりません。

REPORT形式の場合、フィールド モードが使用されて、数値データを含むすべてのデータ値が文字形式で返されます。 REPORT形式用にエクスポートしたデータを再びインポートした場合、数値データのフィールドについては、適切な結果が得られないことがあります。
REPORTパラメータは、漢字文字セットのKANJISJIS_0S、KANJIEUC_0U、および中国語文字セットTCHBIG5_1R0またはSDTCHBIG5_3R0ではサポートされていません。
ワークステーション接続システムでは、Unicodeセッション文字セットが使用されている場合、UTF-8またはUTF-16 REPORTインポート ファイルの最初にBOMを任意選択できます。

VARTEXTキーワード

BTEQは、入力レコードの各区切りデータ項目をVARCHARデータ項目に変換することによってVARTEXTレコードをサポートします。 空のデータ項目が存在する場合、そのデータ項目の対応フィールドはNULLになります。

BTEQは、以下を空のデータ項目として解釈します。

  • 隣接する2つの区切り記号
  • レコードの先頭文字としての区切り記号
  • レコードの末尾文字としての区切り記号
  • 改行のみを含むレコード
  • バイト オーダー マークのみを含むUnicodeデータ ファイル

デフォルトの"|"以外の文字をデータ項目区切り記号として指定できます。 有効なオプション文字を指定する場合は、次の規則が適用されます。

  • タブ以外の制御文字は区切り記号にできない。
  • データに現われる文字は区切り記号にできない。
  • 単一文字のシーケンスのみを区切り記号にできる。
  • マルチバイト文字はUnicodeセッションでのみ許可されます。
  • 区切り記号は、セッション文字セットのエンコーディングに基づいて、VARTEXTデータ ファイル内で有効な文字を表わす必要があります。

すべてのプラットフォームに適用される規則

  • VARTEXTレコードが受け入れ可能なデータ型は、VARCHAR、VARBYTE、およびLONG VARCHARだけである。 他のデータ型を使用した場合、不適切な結果が生じる。
  • VARTEXTファイルはテキスト モードでオープンされるため、VARTEXTデータに埋め込み制御文字(NULL(0x00)、改行(0x0A)、サブ(0x1A)など)が含まれていると、予期しない結果が生じることがある。 制御文字は、DATAおよびINDICDATAのインポートでは使用できる。
  • 入力レコードのデータ項目の数は、USING句で定義されているフィールド数以上でなければなりません。識別子ビットのバイトが増加しない限り、データベースは余分なデータ項目を無視します。
  • データベースが特定のレコードで受け取る識別子ビットのバイト数がUSING句に対して計算されたものと異なる場合、レコードは失敗します。これは通常、2673エラーとして、ソースのパーセル長が定義されたデータと一致しないことを示すメッセージと合わせて表示されます。検出された8フィールドのセットごとに分離バイトが追加されることでNULLの値に対して識別子ビットを指定し、残りのフィールドについては追加の識別子ビット バイトが加えられます。
  • 入力レコードの末尾にある区切り記号は、NULL値を表わします。USING句と異なるようにNULLが識別子ビットの数バイトを増やすと、そのレコードは失敗します。問題を解決し、予想される識別子ビットのバイト数とBTEQが送信する値を一致させるには、2つの方法があります。第1の方法は、区切り記号を使用しないことである。第2の方法は、USING句の最後にダミー列を追加する方法です。
  • 2つの連続した区切り記号を指定すると、対応するフィールドはNULLになる。 レコードが区切り記号から始まる場合には、最初のフィールドがNULLになる。
  • 区切り記号は、USING句で指定されている列の総数より常に1つ少ない。
Unicodeセッション文字セットが使用されている場合、UTF-8またはUTF-16 VARTEXTインポート ファイルの最初にBOMを任意選択できます。

ワークステーション プラットフォームに適用される規則

各レコードは、レコード終わりインディケータで終わらなければならない。このインディケータは、ワークステーションおよびオペレーティング システムに対応する。 例えば、UNIXシステムの場合、インディケータは改行文字でなければならない。 Windowsでは、インディケータは復帰/改行の対で構成されなければならない。 すべての場合、レコード終わり文字(複数も可)は、ワークステーションに対応する文字コードで入っている必要がある。

メインフレーム プラットフォームに適用される規則

  • 区切り記号としてスペースを使用する場合、レコードの終了フィールドには必ず何か入力しなければならない。レコードの最後にあるいくつかのフィールドがNULLで区切り記号にスペースを使用した場合、そのレコードの形式は維持されない。レコードの最後に付いているNULLおよび空白は切り捨てられてしまうため、そのレコードをテーブルに挿入する場合にDBSエラーが発生する。
  • データの最後にスペースを入れる場合は、そのレコードの最後に区切り記号を入力する。
  • Unicodeセッション文字を使用する場合、z/OS BTEQ EBCDICスクリプト内で定義されている区切り記号文字は、VARTEXTデータ ファイルで見つかる実際のUnicode区切り記号と等価なコード ポイントを表わす必要があります。コード ポイントを一致させるために、一部のEBCDIC文字には特別な注意が必要になります。例えば、EBCDICには2つの縦棒文字があります。
    • EBCDIC実線棒文字(0x4F)は、UTF-16BEの0x008Dにマップされます。
    • EBCDIC破線棒文字(0x6A)は、UTF-16BEの0x007Cにマップされます。

SET REPEATSTOP ONを使用して、VARTEXTレコードの処理中にエラーが検出された場合に挿入を停止できます。 デフォルトでは、レコードは拒絶され、処理が続行されます。

インポート ファイルのオープンとクローズ

IMPORTコマンドを入れたときに、インポート ファイルがオープンされます。 インポート ファイルがクローズされるのは、次のようなときです。

  • ファイルの終わりに達したとき
  • 別のIMPORTコマンドを発行したとき
  • AXSMODオプションを使用し、LOGOFFコマンドを発行したとき
  • EXITまたはQUITコマンドを発行したとき
  • インポート ファイルからデータを読み取る際にBTEQでエラーが発生したとき

詳細については、I/Oエラーと異常終了を参照してください。

IMPORTの例

例1 – IMPORT

NEWDATで定義されている想定データ形式INDICDATAのデータセットから読み込むには次のコマンドを使用します。

.IMPORT INDICDATA DDNAME=NEWDAT

例2 – IMPORT

同じインポート ファイルからのインポート データ レコードは、それぞれ異なる行配置を持つテーブルを更新するため必要に応じて再度マップできます。

.import data file = test.data;
using (c1 integer, c2 integer)
insert into table1 (c1, c2)
values (:c1, :c2);
   
using (c1 integer, c2 integer)
insert into table2 (c1, c3)
values (:c1, :c2);
   
using (c1 integer)
update table3 set c1 = :c1 where c2 = :c1;

インポート ファイルtest.dataは、USING句を持つ3つの要求のそれぞれが1つのレコードを処理するよう最低3つのレコードを含む必要があります。

構文規則:

テーブル 定義
Table1 'ct table1 (c1 integer, c2 integer)'
Table2 'ct table1 (c1 integer, c2 char(1), c3 integer)'
Table3 'ct table3 (c1 integer, c2 integer, c3 integer)'

例3 – IMPORT

.PACK 3
.IMPORT data file = sample.data;
   
using (x integer, y integer)
insert into table1 (a,b)
values (:x, :y);
   
using (x integer, y integer)
insert into table2 (a,b)
values (:x, :y);

インポート ファイルsample.dataは10レコードを含むと仮定します。 PACK係数の設定が3でREPEATコマンドの値が1の場合、2つの要求はそれぞれ3レコード処理します。 その結果6レコード処理され、インポート ファイルには4レコード残ります。

PACK句を使用したREPEATコマンドがレコード処理に与える影響

.IMPORT data file = sample.data;
.REPEAT 2 PACK 3
   
using (x integer, y integer)
insert into table1 (a,b)
values (:x, :y);
   
using (x integer, y integer)
insert into table2 (a,b)
values (:x, :y);

REPEATコマンドの値が2でPACK句の値が3なので、table1には6つのレコードが挿入され、table2には1つのレコードが挿入されます。 REPEATコマンドは直後の要求にのみ適用されることに注意してください。 インポート ファイルには3つのレコードが残っています。

PACKコマンドとREPEATコマンドの使用がレコード処理に与える影響

.SET PACK 3
.IMPORT data file = sample.data;
.REPEAT 2
   
using (x integer, y integer)
insert into table1 (a,b)
values (:x, :y);
   
using (x integer, y integer)
insert into table2 (a,b)
values (:x, :y);

PACKコマンドはUSING句を含む両方の要求に影響し、REPEATコマンドは最初の要求にのみ影響します。 その結果table1に6つのレコードが挿入され、table2に3つのレコードが挿入され、インポート ファイルには1つのレコードが残ります。

Table Definition:
table1 ‘ct table1 (c1 integer, c2 integer)’
table2 ‘ct table2 (c1 integer, c2 integer)’

例4 – IMPORT

次の例は、アクセス モジュール(ライブラリ名はMYMOD)を介して予想データ形式DATAのEXPORT.DATというファイルからデータを読み込む例を示したものです。 init-stringを使用していないことに注意してください。

.IMPORT DATA FILE = 'EXPORT.DAT' AXSMOD MYMOD

例5 – IMPORT

次に遅延転送および非遅延転送の両方を示します。 test5.datインポート ファイルが3つのレコードを含む場合、9つの独立したLDOファイルも存在する必要があります。(LDO列につき3ファイル)

c1およびc2は常に100バイト未満なので、それらは常に指定されたDEFERLIMITS値未満のため非遅延転送として常に送信されます。 最後の列は、AS DEFERRED BY NAMEで定義されているため常に遅延モードで転送されます。

DEFERCOLSの値はAS DEFERREDで定義されたLDO列のみ含むため、AS DEFERRED BY NAMEで定義された1つのLDO列は含みませんので注意してください。

.IMPORT DATA DEFERCOLS=2 DEFERLIMITS=500,800 FILE=test5.dat
.REPEAT *
USING (c1 CLOB(100) AS DEFERRED,
	c2 BLOB(100) AS DEFERRED,
	c3 INTEGER,
	c4 CHAR(10),
	c5 XML AS DEFERRED BY NAME)
INSERT INTO table1 VALUES (:c1, :c2, :c3, :c4, :c5);
.IMPORT RESET

例6 – IMPORT

下記はPACK設定がどのようにLDOのインポートに影響を与えるか示します。 下記のインポートの形式がINDICDATAであるため、TOTCOLSオプションが使用される必要があります。 DEFERLIMITSオプションが指定されておらずPACK値は1より大きいため、DEFERLIMITSはデフォルトでオフになります。すべてのLDOは遅延転送としてデータベースに送信されます。

.PACK 10 
.IMPORT INDICDATA DEFERCOLS=3 TOTCOLS=6 FILE=test6.dat 
.REPEAT * 
USING (c1 CLOB(100) AS DEFERRED,
	c2 CLOB(500) AS DEFERRED,
	c3 CLOB(5000) AS DEFERRED,
	c4 SMALLINT,
	c5 CHAR,
	c6 VARCHAR(10))
INSERT INTO table2 VALUES (:c1, :c2, :c3, :c4, :c5, :c6);
.IMPORT RESET

例7 – IMPORT

z/OS BTEQにより、DDNAMEは個々のLDOではなくメインのインポート データ セットに定義する必要があります。 z/OSに遅延モードまたは非遅延モードでLDOをインポートするには、メインのインポート データ セットは、各LDOの実際のデータ セット名を含む必要があります(VARCHAR型で定義)。 PACKコマンドが使用されているとき、DEFERLIMITSオプションは非遅延転送を考慮するために含まれる必要があります。 500バイト以下のLDOは遅延なしにインポートされますが、その他すべてのLDOは遅延モードでインポートされます。

//BTEQ 			EXEC PGM=BTQMAIN
//DAT1 			DD DSN=USERID.BTEQ.EXPFILE,DISP=SHR
//SYSPRINT 			DD DSN=USERID.BTEQ.OUTPUT,DISP=MOD
//SYSABEND 			DD SYSOUT=*
//SYSOUT 			DD SYSOUT=*
//SYSTERM 			DD SYSOUT=*
//SYSIN 			DD DATA,DLM=##
.LOGON xxx/yyy,zzz
.PACK 10
.QUIET ON
.IMPORT INDICDATA DEFERCOLS=5 TOTCOLS=7 DEFERLIMITS=500,2000 DDNAME=DAT1
.REPEAT *
USING (
	myclob1 CLOB(300) AS DEFERRED,
	myclob2 CLOB(1000) AS DEFERRED,
	myclob3 CLOB(1000) AS DEFERRED,
	myclob4 CLOB(1000) AS DEFERRED,
	myclob5 CLOB(1000) AS DEFERRED,
	mychar VARCHAR(10),
	myint INTEGER)
INSERT INTO my_table VALUES (:myclob1, :myclob2, :myclob3,
				:myclob4, :myclob5, :mychar, :myint);
.IMPORT RESET
.LOGOFF
.QUIT
##

例8 – IMPORT

RECORDLENGTHコマンドの設定をIMPORTのRECORDLENGTHオプションで上書きする方法を次に示します。

.RECORDLENGTH=MAX64
/* No override; Using 2-byte record lengths */
.IMPORT DATA FILE=test8a.dat
USING (c1 CHAR(8))
INSERT INTO test8_table VALUES (:c1);
.IMPORT RESET

/* Override record length; Using 4-byte record lengths */
.IMPORT DATA RECORDLENGTH=MAX1MB FILE=test8b.dat
USING (c1 CHAR(8))
INSERT INTO test8_table VALUES (:c1);
.IMPORT RESET

test8a.datファイルの16進ダンプは、次のようになります。

    08006161 61616161 61610A            **aaaaaaaa*

test8b.datファイルに同じ列値が含まれている場合がありますが、レコード長の値が大きいため若干異なるように見えます。

    08000000 61616161 61616161 0A       ****aaaaaaaa*