この章では、SQL*Loaderを使用してXMLデータをOracle XML DBにロードする方法を説明します。
この章の内容は次のとおりです。
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はダイレクト・パス・ロードをサポートしません。つまり、他の |
ユーザー・データのエクスポート時に、Oracle XML DBリポジトリの情報はエクスポートされません。これは、リソースまたはすべての情報のいずれもエクスポートされないことを意味します。
XML列とは、XMLType型であると宣言された列です。
SQL*Loaderは、XMLType列および表をオブジェクト・リレーショナル列および表と同様に処理します。次の項で説明するプライマリ・データ・ファイルまたはLOBFILE値からのLOBデータのロード方法は、XMLTypeデータがLOBとして格納されている場合は、XMLType列および表のロードにも適用されます。
|
関連項目: 『Oracle Databaseユーティリティ』 |
|
注意: LOBフィールドにはSQL文字列を指定できません。これは、LOBFILE_specを指定する場合も同じです。 |
XMLTypeデータは、制御ファイルまたはLOBファイルに存在する場合があります。この場合は、LOBファイルの名前が制御ファイルに表示されます。
XMLTypeデータは非常に大きいデータであるため、SQL*Loaderでは、LOBデータをプライマリ・データ・ファイル(残りのデータを持つインライン)またはLOBファイルのいずれかから、そのデータの格納方法に関係なくロードできます(基礎となる記憶域はオブジェクト・リレーショナルのままです)。
プライマリ・データ・ファイルから内部LOB(バイナリ・ラージ・オブジェクト(BLOB)、キャラクタ・ラージ・オブジェクト(CLOB)および各国語キャラクタ・ラージ・オブジェクト(NCLOB))、またはXMLType列および表をロードするには、次の標準SQL*Loader形式を使用できます。
事前にサイズが決まっているフィールド
デリミタ付きフィールド
Length-Value Pairフィールド
これらの各形式の詳細は、次の項および『Oracle Databaseユーティリティ』を参照してください。
これはLOBをロードする、最も高速で概念的に単純な形式です。
|
注意: ロードするLOBデータはサイズが均等ではないため、サイズが小さいデータ・フィールドに空白を埋め込み、すべてのLOBを同じサイズにできます。 |
この形式で、同じ列(データ・ファイルのフィールド)で異なるサイズのLOBを、問題なく処理します。ただし、このような柔軟性によって、SQL*Loaderでデリミタ文字列を探してデータをスキャンする必要があるため、パフォーマンスに影響します。
単一文字のデリミタで、文字列のデリミタを指定する場合は、データ・ファイルのキャラクタ・セットに注意してください。データ・ファイルのキャラクタ・セットが制御ファイルのキャラクタ・セットと異なる場合は、デリミタを16進文字列の表記法で指定できます('hexadecimal string')。デリミタを実際に16進数文字列で指定する場合は、入力データ・ファイルのキャラクタ・セット中の有効な文字で指定する必要があります。一方、16進数文字列で指定しない場合、デリミタは、クライアント(制御ファイル)のキャラクタ・セットで指定してください。この場合、デリミタは、SQL*Loaderによってデータ・ファイル内で検索される前に、データ・ファイルのキャラクタ・セットに変換されます。
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データ型を使用します。
XMLTypeデータは制御ファイル自体から直接ロードできます。このリリースでは、SQL*LoaderはXMLTypeデータを他のスカラー型と同様に処理します。たとえば、NUMBER列に続いてXMLType列がオブジェクト・リレーショナル形式で格納されている表について考えてみます。この表に使用される制御ファイルには、NUMBER列の値とそれに続くXMLTypeインスタンスの値が含まれます。
SQL*Loaderは、サイズが非常に大きいXMLTypeインスタンスにも対応できます。この場合は、データをLOBファイルからロードするオプションがあります。
SQL*Loaderを使用すると、大量のXMLデータをOracle Databaseにロードできます。
例35-1は、XMLTypeデータをOracle Databaseにロードする方法を示しています。
例35-1 SQL*Loaderを使用したOracle Databaseへの大規模なXML文書のロード
この例では、制御ファイルload_data.ctlを使用してXMLTypeデータを表fooにロードしています。このコードは、XML Schema person.xsdをOracle XML DBに登録した後、表fooを作成しています。XML Schema登録プロセス中にも表を作成できます。
CREATE TYPE person_t AS OBJECT(name VARCHAR2(100), city VARCHAR2(100));/
BEGIN
-- Delete schema if it already exists (else error)
DBMS_XMLSCHEMA.deleteSchema('http://www.oracle.com/person.xsd', 4);
END;/
BEGIN
DBMS_XMLSCHEMA.registerschema('http://www.oracle.com/person.xsd',
'<schema xmlns="http://www.w3.org/2001/XMLSchema"' ||
' xmlns:per="http://www.oracle.com/person.xsd"' ||
' xmlns:xdb="http://xmlns.oracle.com/xdb"' ||
' elementFormDefault="qualified"' ||
' targetNamespace="http://www.oracle.com/person.xsd">' ||
' <element name="person" type="per:persontype"' ||
' xdb:SQLType="PERSON_T"/>' ||
' <complexType name="persontype" xdb:SQLType="PERSON_T">' ||
' <sequence>' ||
' <element name="name" type="string" xdb:SQLName="NAME"' ||
' xdb:SQLType="VARCHAR2"/>' ||
' <element name="city" type="string" xdb:SQLName="CITY"' ||
' xdb:SQLType="VARCHAR2"/>' ||
' </sequence>' ||
' </complexType>' ||
' </schema>',
TRUE,
FALSE,
FALSE);
END;/
CREATE TABLE foo OF XMLType
XMLSCHEMA "http://www.oracle.com/person.xsd" ELEMENT "person";
次に、登録済XML Schemaのperson.xsdを使用してXMLTypeデータをロードするための制御ファイルload_data.ctlのコンテンツを示します。
LOAD DATA INFILE * INTO TABLE foo TRUNCATE XMLType(xmldata) FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ( xmldata ) BEGINDATA <person xmlns="http://www.oracle.com/person.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.oracle.com/person.xsd http://www.oracle.com/person.xsd"> <name> xyz name 2</name> </person>
XMLデータをOracle Databaseにロードするには、コマンドsqlldrを次のように使用します。
sqlldr load_data.ctl
ダイレクト・パス・ロードを使用する場合は、次のようにします。
sqlldr load_data.ctl direct=y
load_data.ctlでは、データは制御ファイル自体に存在し、レコードの範囲は1行のみです(ここでは、ページ表示の都合上、複数行に分かれています)。
次の例では、データが制御ファイル(lod2.ctl)とは別のファイル(person.dat)に存在しています。person.datファイルには、複数の行が含まれており、また、各行の範囲も複数行にわたります。次に、制御ファイルlod2.ctlを示します。
LOAD DATA
INFILE *
INTO TABLE foo TRUNCATE
XMLType(xmldata)
FIELDS(fill filler CHAR(1),
xmldata LOBFILE (CONSTANT person.dat)
TERMINATED BY '<!-- end of record -->')
BEGINDATA
0
0
0
BEGINDATAの後の3つのゼロ(0)は、3つのレコードがデータ・ファイルperson.datに存在することを示します。各レコードは、<!-- end of record -->で終了します。person.datの内容は次のとおりです。
<person xmlns="http://www.oracle.com/person.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.oracle.com/person.xsd
http://www.oracle.com/person.xsd">
<name>xyz name 2</name>
</person>
<!-- end of record -->
<person xmlns="http://www.oracle.com/person.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.oracle.com/person.xsd
http://www.oracle.com/person.xsd">
<name> xyz name 2</name>
</person>
<!-- end of record -->
<person xmlns="http://www.oracle.com/person.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.oracle.com/person.xsd
http://www.oracle.com/person.xsd">
<name>xyz name 2</name>
</person>
<!-- end of record -->