ヘッダーをスキップ
Oracle® XML DB開発者ガイド
11gリリース2 (11.2)
B70200-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

35 SQL*Loaderを使用したXMLデータのロード

この章では、SQL*Loaderを使用してXMLデータをOracle XML DBにロードする方法を説明します。

この章の内容は次のとおりです。

Oracle DatabaseへのXMLTypeデータのロードの概要

Oracle9iリリース1(9.0.1)以上のExport/Import UtilityおよびSQL*Loaderでは、列の型としてXMLTypeがサポートされています。Oracle Database 10g以降は、SQL*LoaderはXMLType表のロードもサポートしています。XMLTypeデータは、SQL*Loaderを使用して、格納方式(構造化記憶域、非構造化記憶域またはバイナリXML記憶域)に関係なく、従来の方式またはダイレクト・パス方式でロードできます。


注意:

XMLデータの構造化記憶域の場合、データにXML Schema型の継承(拡張または制限)が含まれている場合、SQL*Loaderはダイレクト・パス・ロードをサポートしません

つまり、他のcomplexType要素(ベース型)を拡張または制限するXML SchemaにcomplexType要素が含まれている場合は、SQLタイプのいくつかは他のSQLタイプによって定義されます。この場合、オブジェクト・リレーショナル記憶域では、ダイレクト・パス・ロードはサポートされません。



関連項目:

第36章「XMLType表のエクスポートおよびインポート」および『Oracle Databaseユーティリティ』

ユーザー・データのエクスポート時に、Oracle XML DBリポジトリの情報はエクスポートされません。つまり、リソースまたはすべての情報のいずれもエクスポートされません。

SQL*Loaderを使用したXMLTypeデータのロード

XML列とは、XMLType型であると宣言された列です。

SQL*Loaderは、XMLType列および表をオブジェクト・リレーショナル列および表と同様に処理します。次の項で説明するプライマリ・データ・ファイルまたはLOBFILE値からのLOBデータのロード方法は、XMLTypeデータがLOBとして格納されている場合は、XMLType列および表のロードにも適用されます。


関連項目:

『Oracle Databaseユーティリティ』


注意:

LOBフィールドにはSQL文字列を指定できません。これは、LOBFILE_specを指定する場合も同じです。

XMLTypeデータは、制御ファイルまたはLOBファイルに存在する場合があります。この場合は、LOBファイルの名前が制御ファイルに表示されます。

XMLTypeデータは非常に大きいデータであるため、SQL*Loaderでは、LOBデータをプライマリ・データ・ファイル(残りのデータを持つインライン)またはLOBファイルのいずれかから、そのデータの格納方法に関係なくロードできます(基礎となる記憶域はオブジェクト・リレーショナルのままです)。

SQL*Loaderを使用したLOB内のXMLTypeデータのロード

プライマリ・データ・ファイルから内部LOB(バイナリ・ラージ・オブジェクト(BLOB)、キャラクタ・ラージ・オブジェクト(CLOB)および各国語キャラクタ・ラージ・オブジェクト(NCLOB))、またはXMLType列および表をロードするには、次の標準SQL*Loader形式を使用できます。

  • 事前にサイズが決まっているフィールド

  • デリミタ付きフィールド

  • Length-Value Pairフィールド

これらの各形式の詳細は、次の項および『Oracle Databaseユーティリティ』を参照してください。

事前にサイズが決まっているフィールドのLOBデータのロード

これはLOBをロードする、最も高速で概念的に単純な形式です。


注意:

ロードするLOBデータはサイズが均等ではないため、サイズが小さいデータ・フィールドに空白を埋め込み、すべてのLOBを同じサイズにできます。

デリミタ付きフィールドのLOBデータのロード

この形式で、同じ列(データ・ファイルのフィールド)で異なるサイズのLOBを、問題なく処理します。ただし、このような柔軟性によって、SQL*Loaderでデリミタ文字列を探してデータをスキャンする必要があるため、パフォーマンスに影響します。

単一文字のデリミタで、文字列のデリミタを指定する場合は、データ・ファイルのキャラクタ・セットに注意してください。データ・ファイルのキャラクタ・セットが制御ファイルのキャラクタ・セットと異なる場合は、デリミタを16進文字列の表記法で指定できます('hexadecimal string')。デリミタを実際に16進数文字列で指定する場合は、入力データ・ファイルのキャラクタ・セット中の有効な文字で指定する必要があります。一方、16進数文字列で指定しない場合、デリミタは、クライアント(制御ファイル)のキャラクタ・セットで指定してください。この場合、デリミタは、SQL*Loaderによってデータ・ファイル内で検索される前に、データ・ファイルのキャラクタ・セットに変換されます。

LOBFILEからのLOBデータを含んだXML列のロード

LOBデータは、非常に長いデータであるため、プライマリ・データ・ファイルではなく、LOBFILEからロードすることが有効です。LOBFILEでは、LOBデータのインスタンスは、フィールド(事前に決められたサイズ、デリミタ付き、Length-Value Pair)内にあるとみなされますが、これらのフィールドは、レコードに編成されていません(LOBFILEにはレコードの概念がありません)。そのため、レコードを扱うことによって発生するオーバーヘッドを回避できます。このようなデータの編成方法は、LOBのロードにとって理想的です。

LOBFILEのLOBはメモリーに収まる必要はありません。SQL*Loaderは、LOBFILEを64KBのチャンクで読み取ります。

LOBFILEのデータ・フィールドは、次のいずれかの型であり、どれもXML列のロードに使用できます。

  • ファイルの内容全体を読み取る単一のLOBフィールド

  • サイズが決められたフィールド(固定長フィールド)

  • デリミタ付きフィールド(TERMINATED BYまたはENCLOSED BY)

    PRESERVE BLANKS句は、LOBFILEから読み取るフィールドには使用できません。

  • Length-Value Pairフィールド(可変長フィールド)。

    この型のフィールドからデータをロードするには、VARRAY、またはVARCHARまたはVARCHAR2 SQL*Loaderデータ型を使用します。

LOBFILEの指定

LOBFILEを静的に指定(ファイルにファイル名を指定)するか、または動的に指定(FILLERフィールドをファイル名のソースとして使用)できます。いずれの場合も、LOBFILEの終わりに到達するとファイルがクローズされ、そのファイルからさらにデータを読み取る場合は、空のフィールドからデータを読み取ることになります。

同じLOBFILEを、2つの異なるフィールドのソースとして指定しないでください。指定すると、通常、2つのフィールドで、データが別々に読み取られます。

SQL*Loaderによる制御ファイルからのXMLTypeデータの直接ロード

XMLTypeデータは制御ファイルから直接ロードできます。SQL*Loaderは、XMLTypeデータを他のスカラー型と同様に処理します。たとえば、NUMBER列に続いてXMLType列がオブジェクト・リレーショナル形式で格納されている表について考えてみます。この表に使用される制御ファイルには、NUMBER列の値とそれに続くXMLTypeインスタンスの値が含まれます。

SQL*Loaderは、サイズが非常に大きいXMLTypeインスタンスに対応できます。このようなデータをLOBファイルからロードするオプションもあります。

Oracle Databaseへの大規模なXML文書のロード

SQL*Loaderを使用すると、大量のXMLデータをOracle Databaseにロードできます。次の手順を実行します。

  1. データ・ファイル(filelist.datなど)、つまりロードするXML文書の場所を特定します。

  2. データ・ファイルにリストされているファイルを処理するコマンドを使用して、制御ファイル(load_data.ctlなど)を作成します。

  3. SQL*Loaderシェル・コマンドsqlldrを起動し、この制御ファイル名を渡します。

これは例35-2例35-1例35-3で説明しています。ファイルfilelist.datには、2002年の発注書を含むXMLファイルがリストされます。

例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

関連項目: