Oracle

使用控製文件將 XML 文件載入到 Oracle 11g DB

  • August 16, 2016

我正在使用 Oracle 11g XML 數據庫並嘗試使用控製文件和sqlldr實用程序將 XML 文件載入到該數據庫。所有這些 XML 文件都有一個元素,其中包含帶有時間戳的日期字元串(以及中間的字母 T)。Oracle 拒絕此日期字元串,因為其中包含 T,因此 XML 文件未載入到數據庫中。

我想TO_TIMESTAMP_TZ在數據載入期間對日期字元串使用 Oracle 函式,但我不知道該怎麼做。那就是我需要幫助的地方。如果有任何其他方式來導入 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 )

我相信我也可以使用sqlldrSQL*Plus 命令行上的實用程序執行上述控製文件,但不確定這個選項。如果這是可能的,我想我可以在執行控製文件之前在命令行上 ALTER SESSION (以某種方式格式化日期字元串)。

filelist.dat上面提到的包含輸入 XML 文件的條目,其中一行列出了一個 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;
 /

上面的第二個註冊是腳本中的最後一個,它創建了 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 拒絕它。

因為我讓 Oracle 使用 XML 文件中的數據處理 STXP 表的填充,所以我不確定是否可以設置觸發器以在將輸入 XML 文件中的日期字元串保存到數據庫之前對其進行預處理。我認為有一種方法可以在控製文件中做到這一點。

我認為您必須這樣做的方式是 Jokke 建議:與其將 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

如果您不知道如何使用 SQL Loader 對其進行管理,您可以在要導入的表中添加一個 varchar 列,並添加一個插入觸發器,然後將該 varchar 列轉換為表中的某個日期列。

引用自:https://dba.stackexchange.com/questions/40582