Oracle
在儲存過程中將 XML 輸入插入到 oracle 表的最佳方法是什麼?
我想編寫一個具有 XML 輸入(clob 類型)並將數據插入表的儲存過程。我的 XML 結構是這樣的:
<rowset> <row> <name>tom</name> <family>mack</family> .... </row> <row> <name>marry</name> <family>skot</family> .... </row> ... </rowset>
我剛剛購買了 oracle 給我的許多選項來處理這個問題。using
extractvalue and XMLSequence
- usingDBMS_XMLDOM
- usingDBMS_XMLStore
或許多其他選項。我想根據使用的性能和資源知道哪個更好。輸入的 XML 通常小於 50KB。
您可以使用以下命令直接在 SQL 中查詢您的 XML 數據
XMLTABLE
:SQL> VARIABLE xml VARCHAR2(4000); SQL> BEGIN :xml := 2 '<rowset> 3 <row> 4 <name>tom</name> 5 <family>mack</family> 6 </row> 7 <row> 8 <name>marry</name> 9 <family>skot</family> 10 </row> 11 </rowset>'; 12 END; 13 / PL/SQL procedure successfully completed SQL> SELECT x.* 2 FROM XMLTable('for $i in /rowset/row return $i' 3 passing XMLTYPE(:xml) columns 4 name VARCHAR2(200) path 'name', 5 family VARCHAR2(200) path 'family' 6 ) x; NAME FAMILY ------- ------- tom mack marry skot
您也可以使用
XMLSequence
andEXTRACT
(例如,請參閱此 SO 問題),但如文件中所述,這些功能已被棄用。另一個選項是
DBMS_XMLSTORE
,雖然你不能真正自定義它(需要輸入 xml 標記和輸出列名之間的完美匹配):SQL> CREATE TABLE my_table ("name" VARCHAR2(10), "family" VARCHAR2(10)); Table created SQL> DECLARE 2 l_ctx dbms_xmlstore.ctxtype; 3 l_rows NUMBER; 4 BEGIN 5 l_ctx := dbms_xmlstore.newcontext('MY_TABLE'); -- Get saved context 6 dbms_xmlstore.clearUpdateColumnList(l_ctx); -- Clear the update settings 7 8 -- Set the columns to be updated/inserted as a list of values 9 dbms_xmlstore.setUpdateColumn(l_ctx, 'name'); 10 dbms_xmlstore.setUpdateColumn(l_ctx, 'family'); 11 -- Set ROW tag 12 dbms_xmlstore.setRowTag(l_ctx, 'row'); 13 14 -- Insert the doc. 15 l_rows := DBMS_XMLSTORE.insertXML(l_ctx, :xml); 16 DBMS_OUTPUT.put_line(l_rows || ' rows inserted.'); 17 18 -- Close the context 19 DBMS_XMLSTORE.closeContext(l_ctx); 20 21 END; 22 / 2 rows inserted. PL/SQL procedure successfully completed SQL> select * from my_table; name family ---------- ---------- tom mack marry skot
我不確定在性能方面哪個選項更快,這當然取決於數據——你必須進行基準測試。