web-dev-qa-db-ja.com

制御ファイルを使用してXMLドキュメントをOracle 11g DBにロードする

私はOracle 11g XMLデータベースを使用しており、制御ファイルとsqlldrユーティリティを使用してこのDBにXMLドキュメントをロードしようとしています。これらすべてのXMLファイルには、タイムスタンプ付きの日付文字列(およびその中央に文字T)を含む要素があります。 OracleはTが原因でこの日付文字列を拒否し、XMLファイルはDBにロードされません。

データの読み込み中に日付文字列でOracle関数TO_TIMESTAMP_TZを使用したいのですが、方法がわかりません。それは私が助けを必要とするところです。 XML(タイムスタンプ付きの日付文字列)をインポートする他の方法がある場合は、それも試してみます。

XMLファイルの日付エントリは次のとおりです。

<ns3:EntryDateTime cls="U">2013-04-20T21:02:52.468-04:00</ns3:EntryDateTime>

そして、ここに制御ファイル全体のコードがあります:

load data infile 'filelist.dat' 
  append into table STXP xmltype(XMLDATA)
  ( filename filler char(120), XMLDATA lobfile(filename) terminated by eof )

SQL * Plusコマンドラインでもsqlldrユーティリティを使用して上記の制御ファイルを実行できると思いますが、このオプションについてはわかりません。これが可能であれば、制御ファイルを実行する前にコマンドラインで(なんらかの方法で日付文字列をフォーマットするために)ALTER SESSIONを実行できると思います。

上記のfilelist.datには、入力XMLファイルのエントリが含まれ、1行に1つのXMLファイルがリストされています。上記の日付エントリは、各XMLファイルに必要です。各XMLファイルには約50の異なる要素があり、一部は必須、一部はオプションです。よろしくお願いします。

更新:日付文字列の定義を含むスキーマと他の100個のスキーマをスクリプトで正常に登録しました。このスクリプトは非常に大きいため、ここでは2つの登録部分のみを投稿しています。

DECLARE
SCHEMAURL VARCHAR2( 100 );
SCHEMADOC VARCHAR2( 100 );
BEGIN
SCHEMAURL := 'http://www.some.org/stxp/DataTypes.xsd';
SCHEMADOC := 'DataTypes.xsd';
DBMS_XMLSCHEMA.registerSchema( 
    SCHEMAURL, 
    BFILENAME( 'XSD_DIR', SCHEMADOC ),
    LOCAL => TRUE, -- local
    GENTYPES => TRUE,  -- generate object types
    GENBEAN => FALSE, -- no Java beans
    GENTABLES => TRUE,  -- generate object tables
    OWNER => USER );
    SCHEMAURL := 'http://www.some.org/stxp/STXP.xsd';
    SCHEMADOC := 'STXP.xsd';
    DBMS_XMLSCHEMA.registerSchema( 
    SCHEMAURL, 
    BFILENAME( 'XSD_DIR', SCHEMADOC ),
    LOCAL => TRUE, -- local
    GENTYPES => TRUE,  -- generate object types
    GENBEAN => FALSE, -- no Java beans
    GENTABLES => TRUE,  -- generate object tables
    OWNER => USER );
  END;
  /

上記の2番目の登録はスクリプトの最後であり、これによりテーブルSTXPが作成され、約800のXMLファイルをロードしようとしています。各XMLファイルには、stxpと呼ばれるルート要素があります。

これは日付文字列の関連する定義です:

 <xsd:simpleType name="DT" xdb:SQLType="TIMESTAMP WITH TIME ZONE">
    <xsd:restriction base="xsd:dateTime"/>
</xsd:simpleType>

そして、これは私が上記の定義を使用している方法です:

<element name="EntryDateTime" type="oth:DT"/>

上記の要素を(テスト目的で)オプションにして、XMLファイルから日付文字列エントリ(この質問の冒頭付近に記載)を削除すると、XMLファイルがOracle XMLデータベースに正常にロードされます。このエントリを(必要であるため)XMLファイルに戻すと、Oracleはそれを拒否します。

XMLファイルからのデータでSTXPテーブルの作成をOracleに任せるため、データベースに保存する前に入力XMLファイルからの日付文字列を前処理するトリガーを設定できるかどうかわかりません。制御ファイルでそれを行う方法があると思います。

4
Asif

私はあなたがそれをしなければならない方法はヨッケの提案だと思います:DTデータ型を_TIMESTAMP WITH TIME ZONE_として定義する代わりに、むしろそれをVARCHAR2(29)として定義します。ここで29文字で十分ですが、より広く定義できます。

次に、XMLからデータを抽出するときに、それを_TIMESTAMP WITH TIME ZONE_に変換する必要があります。

ただし、列を「xsd:dateTime」として定義することもできます。 http://www.adp-gmbh.ch/xml/schema.html および http://www.w3.org/TR/xmlschema-2/#dateTime を参照してください。 =

1
Colin 't Hart

SQLローダーで管理する方法がわからない場合は、インポートするテーブルにvarchar列を追加し、挿入ティガーを追加して、そのvarchar列をテーブルの日付列に変換することができます。

0
Jokke Heikkilä