使用控製文件將 XML 文件載入到 Oracle 11g DB
我正在使用 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 )
我相信我也可以使用
sqlldr
SQL*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 列轉換為表中的某個日期列。