35 XMLデータのロード方法
XMLデータをOracle XML DBにロードする主な方法は、SQL*Loaderを使用することです。
- Oracle DatabaseへのXMLTypeデータのロードの概要
XMLType
データは、SQL*Loaderを使用して、格納方式(オブジェクト・リレーショナル記憶域またはバイナリXML記憶域)に関係なく、従来の方式またはダイレクト・パス方式でロードできます。 - SQL*Loaderを使用したXMLTypeデータのロード
SQL*Loaderは、XMLType
列および表をオブジェクト・リレーショナル列および表と同様に処理します。プライマリ・データ・ファイルまたはLOBFILE
値からLOBデータをロードするすべての方法は、XMLType
データがLOBとして格納されている場合は、XMLType
列および表のロードにも適用されます。
関連トピック
35.1 Oracle DatabaseへのXMLTypeデータのロードの概要
XMLType
データは、SQL*Loaderを使用して、格納方式(オブジェクト・リレーショナル記憶域またはバイナリXML記憶域)に関係なく、従来の方式またはダイレクト・パス方式でロードできます。
Oracle9iリリース1(9.0.1)以上のExport/Import UtilityおよびSQL*Loaderでは、列の型としてXMLType
がサポートされています。Oracle Database 10g以降は、SQL*LoaderはXMLType
表のロードもサポートしています。
注意:
XMLデータのオブジェクト・リレーショナル記憶域の場合、データにXML Schema型の継承(拡張または制限)が含まれている場合、SQL*Loaderはダイレクト・パス・ロードをサポートしません。
つまり、他のcomplexType
要素(ベース型)を拡張または制限するXML SchemaにcomplexType
要素が含まれている場合は、SQLタイプのいくつかは他のSQLタイプによって定義されます。この場合、オブジェクト・リレーショナル記憶域では、ダイレクト・パス・ロードはサポートされません。
ユーザー・データのエクスポート時に、Oracle XML DBリポジトリの情報はエクスポートされません。つまり、リソースまたはすべての情報のいずれもエクスポートされません。
35.2 SQL*Loaderを使用したXMLTypeデータのロード
SQL*Loaderは、XMLType
列および表をオブジェクト・リレーショナル列および表と同様に処理します。プライマリ・データ・ファイルまたはLOBFILE
値からLOBデータをロードするすべての方法は、XMLType
データがLOBとして格納されている場合は、XMLType
列および表のロードにも適用されます。
関連項目:
注意:
LOBフィールドにはSQL文字列を指定できません。これは、LOBFILE_spec
を指定する場合も同じです。
XMLType
データは、制御ファイルまたはLOBファイルに存在する場合があります。この場合は、LOBファイルの名前が制御ファイルに表示されます。
XMLType
データは非常に大きいデータであるため、SQL*Loaderでは、LOBデータをプライマリ・データ・ファイル(残りのデータを持つインライン)またはLOBファイルのいずれかから、そのデータの格納方法に関係なくロードできます(基礎となる記憶域はオブジェクト・リレーショナルのままです)。
- SQL*Loaderを使用したXMLType LOBデータのロード
プライマリ・データ・ファイルから内部LOB (バイナリ・ラージ・オブジェクト(BLOB)、キャラクタ・ラージ・オブジェクト(CLOB)および各国語キャラクタ・ラージ・オブジェクト(NCLOB))、またはXMLType
列および表をロードするには、次の標準SQL*Loader形式を使用します。 - SQL*Loaderによる制御ファイルからのXMLTypeデータの直接ロード
XMLType
データは、制御ファイルから直接ロードできます。SQL*Loaderは、XMLType
データを他のスカラー型と同様に処理します。 - SQL*Loaderを使用した大規模なXML文書のロード
SQL*Loaderを使用すると、大量のXMLデータをOracle Databaseにロードできます。
親トピック: XMLデータのロード方法
35.2.1 SQL*Loaderを使用したXMLType LOBデータのロード
プライマリ・データ・ファイルから内部LOB (バイナリ・ラージ・オブジェクト(BLOB)、キャラクタ・ラージ・オブジェクト(CLOB)および各国語キャラクタ・ラージ・オブジェクト(NCLOB))、またはXMLType
列および表をロードするには、次の標準SQL*Loader形式を使用します。
-
事前にサイズが決まっているフィールド
-
デリミタ付きフィールド
-
Length-Value Pairフィールド
これらの各形式の詳細は、次の項およびOracle Databaseユーティリティを参照してください。
- 事前にサイズが決まっているフィールドを使用したLOBデータのロード
事前にサイズが決まっているフィールドは、LOBをロードする非常に高速で概念的に単純なSQL*Loader形式を構成します。 - デリミタ付きフィールドを使用したLOBデータのロード
デリミタ付きフィールド形式は、同じ列(データ・ファイルのフィールド)で異なるサイズのLOBを処理します。ただし、このような柔軟性によって、SQL*Loaderでデリミタ文字列を探してデータをスキャンする必要があるため、パフォーマンスに影響します。 - LOBFILEからのLOBデータを含んだXML列のロード
LOBデータは、非常に長いデータであるため、プライマリ・データ・ファイルではなく、LOBFILEからロードすることが有効です。 - LOBFILEの指定
LOBFILEを静的に指定(ファイルにファイル名を指定)するか、または動的に指定(FILLERフィールドをファイル名のソースとして使用)できます。
35.2.1.1 事前にサイズが決まっているフィールドを使用したLOBデータのロード
事前にサイズが決まっているフィールドは、LOBをロードする非常に高速で概念的に単純なSQL*Loader形式を構成します。
注意:
ロードするLOBデータはサイズが均等ではないため、サイズが小さいデータ・フィールドに空白を埋め込み、すべてのLOBを同じサイズにできます。
35.2.1.2 デリミタ付きフィールドを使用したLOBデータのロード
デリミタ付きフィールド形式は、同じ列(データ・ファイルのフィールド)で異なるサイズのLOBを処理します。ただし、このような柔軟性によって、SQL*Loaderでデリミタ文字列を探してデータをスキャンする必要があるため、パフォーマンスに影響します。
単一文字のデリミタで、文字列のデリミタを指定する場合は、データ・ファイルのキャラクタ・セットに注意してください。データ・ファイルのキャラクタ・セットが制御ファイルのキャラクタ・セットと異なる場合は、デリミタを16進文字列の表記法で指定できます('hexadecimal string')。デリミタを実際に16進数文字列で指定する場合は、入力データ・ファイルのキャラクタ・セット中の有効な文字で指定する必要があります。一方、16進数文字列で指定しない場合、デリミタは、クライアント(制御ファイル)のキャラクタ・セットで指定してください。この場合、デリミタは、SQL*Loaderによってデータ・ファイル内で検索される前に、データ・ファイルのキャラクタ・セットに変換されます。
35.2.1.3 LOBFILEからのLOBデータを含んだXML列のロード
LOBデータは、非常に長いデータであるため、プライマリ・データ・ファイルではなく、LOBFILEからロードすることが有効です。
LOBFILEでは、LOBデータのインスタンスは、フィールド(事前に決められたサイズ、デリミタ付き、Length-Value Pair)内にあるとみなされますが、これらのフィールドは、レコードに編成されていません(LOBFILEにはレコードの概念がありません)。そのため、レコードを扱うことによって発生するオーバーヘッドを回避できます。このようなデータの編成方法は、LOBのロードにとって理想的です。
LOBFILEからロードしたLOBをメモリーに合わせる必要はありません。SQL*Loaderでは、64KB単位でLOBFILEが読み込まれます。
LOBFILEのデータ・フィールドは、次のいずれかの型であり、どれもXML列のロードに使用できます。
-
ファイルの内容全体を読み込む単一のLOBフィールド
-
サイズが決められたフィールド(固定長フィールド)
-
デリミタ付きフィールド(
TERMINATED BY
またはENCLOSED BY
)PRESERVE BLANKS
句は、LOBFILEから読み取るフィールドには使用できません。 -
Length-Value Pairフィールド(可変長フィールド)。
この型のフィールドからデータをロードするには、
VARRAY
、またはVARCHAR
またはVARCHAR2
SQL*Loaderデータ型を使用します。
35.2.2 SQL*Loaderによる制御ファイルからのXMLTypeデータの直接ロード
XMLType
データは、制御ファイルから直接ロードできます。SQL*Loaderは、XMLType
データを他のスカラー型と同様に処理します。
たとえば、NUMBER
列に続いてXMLType
列がオブジェクト・リレーショナル形式で格納されている表について考えてみます。この表に使用される制御ファイルには、NUMBER
列の値とそれに続くXMLType
インスタンスの値が含まれます。
SQL*Loaderは、サイズが非常に大きいXMLType
インスタンスに対応できます。このようなデータをLOBファイルからロードするオプションもあります。
35.2.3 SQL*Loaderを使用した大規模なXML文書のロード
SQL*Loaderを使用すると、大量のXMLデータをOracle Databaseにロードできます。
-
データ・ファイル(
filelist.dat
など)、つまりロードするXML文書の場所を特定します。 -
データ・ファイルにリストされているファイルを処理するコマンドを使用して、制御ファイル(
load_data.ctl
など)を作成します。 -
SQL*Loaderシェル・コマンド
sqlldr
を起動し、この制御ファイル名を渡します。
これは例35-1、例35-2、例35-3で説明しています。ファイルfilelist.dat
には、2002年の発注書を含むXMLファイルがリストされます。
アプリケーションで索引または制約が使用されている場合、これらの処理を行うとロードのパフォーマンスに影響する場合があります。パッケージDBMS_XMLSTORAGE_MANAGE内のPL/SQLサブプログラム
disableIndexesAndConstraintsおよび
enableIndexesAndConstraints
を使用して、この処理を一時的に無効化できます。
関連項目:
-
シェル・コマンド
sqlldr
の詳細は、Oracle Databaseユーティリティを参照してください。 -
DBMS_XMLSTORAGE_MANAGE
サブプログラムdisableIndexesAndConstraints
およびenableIndexesAndConstraints
の詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。
例35-1 データ・ファイルfilelist.dat: ロードするXMLファイルのリスト
2002/Jan/AMCEWEN-20021009123335370PDT.xm 2002/Jan/AWALSH-2002100912333570PDT.xml 2002/Jan/CJOHNSON-20021009123335170PDT.xml 2002/Jan/LSMITH-20021009123335500PDT.xml 2002/Jan/PTUCKER-20021009123335430PDT.xml 2002/Jan/SBELL-20021009123335280PDT.xml 2002/Jan/SKING-20021009123335560PDT.xml 2002/Jan/SMCCAIN-20021009123335470PDT.xml 2002/Jan/TFOX-20021009123335520PDT.xml 2002/Jan/VJONES-20021009123335350PDT.xml 2002/Jan/WSMITH-20021009123335450PDT.xml 2002/Feb/AMCEWEN-20021009123335600PDT.xml 2002/Feb/AMCEWEN-20021009123335701PDT.xml 2002/Feb/DAUSTIN-20021009123335811PDT.xml 2002/Feb/EABEL-20021009123335791PDT.xml 2002/Feb/PTUCKER-20021009123335721PDT.xml 2002/Feb/PTUCKER-20021009123335821PDT.xml 2002/Feb/SBELL-20021009123335771PDT.xml 2002/Feb/SMCCAIN-20021009123335681PDT.xml 2002/Feb/WSMITH-20021009123335650PDT.xml 2002/Feb/WSMITH-20021009123335741PDT.xml 2002/Feb/WSMITH-20021009123335751PDT.xml ...
例35-2 発注書XML文書のロードに使用する制御ファイルload_datra.ctl
load data infile 'filelist.dat' append into table PURCHASEORDER xmltype(XMLDATA) ( filename filler char(120), XMLDATA lobfile(filename) terminated by eof )
例35-3 シェル・コマンドsqlldrを使用したXMLデータのロード
sqlldr load_data.ctl
ダイレクト・パス・ロードを使用する場合は、かわりに次のコマンドを使用します。
sqlldr load_data.ctl direct=y