Oracle

在儲存過程中將 XML 輸入插入到 oracle 表的最佳方法是什麼?

  • December 8, 2017

我想編寫一個具有 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- using DBMS_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

您也可以使用XMLSequenceand EXTRACT(例如,請參閱此 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

我不確定在性能方面哪個選項更快,這當然取決於數據——你必須進行基準測試。

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