2016-03-17 57 views
1

我是新來的XML,但已經被賦予了一個任務來輸出100,000個記錄的測試集到一個XML文件,這將是一個更大的文件在未來。在每個記錄中,還有子數據的子集也需要輸出到文件中(請參見下面的代碼結構)。從PL/SQL程序輸出100,000條記錄到XML文件的最佳方式

我試圖找到這個dbms_xmldom的最佳解決方案,但看着論壇這是一個過時的工具,但我知道有XMLElement,但我認爲這隻適用於SQL而不是PL/SQL。

除了dbms_xmldom之外,還有其他工作在PL/SQL中的東西還是一樣好,還是應該堅持我所做的。該工具必須將每條記錄輸出到輸出文件。

數據庫的當前版本爲11g第1版

任何意見將是提前十分感謝。

BEGIN 

    For r_prod_rec IN c_prod_rec 
    LOOP 
    output process master record to XML file 

    For r_prod_child1_rec IN c_prod_child1_rec(r_prod_rec.id) 
    LOOP 
     output process child record from table1 to XML file 
    END LOOP 

    For r_prod_child2_rec IN c_prod_child2_rec(r_prod_rec.id) 
    LOOP 
     output process child record table2 to XML file 
    END LOOP 

    END LOOP 

    END 
+0

你爲什麼要解僱SQL的解決方案嗎? – MT0

+1

我同意MT0你不能只在sql和導出? http://docs.oracle.com/cd/E11882_01/appdev.112/e23094/xdb13gen.htm#ADXDB1600 –

+0

「xmlelement」和其他XML函數(如'xmlforest')在PL/SQL中也能很好地工作。你爲什麼認爲他們不工作? – user272735

回答

0

甲骨文設置

CREATE TABLE parents (ID, Attr1, Attr2) AS 
SELECT LEVEL, 'A.' || LEVEL, 'B.' || LEVEL 
FROM DUAL 
CONNECT BY LEVEL <= 5; 

CREATE TABLE children (ID, Attr1, Parent_ID) AS 
SELECT LEVEL, 'C.' || LEVEL, CASE WHEN LEVEL <= 3 THEN 1 
            WHEN LEVEL <= 6 THEN 2 
            WHEN LEVEL <= 8 THEN 4 
                ELSE 5 
          END FROM DUAL 
CONNECT BY LEVEL <= 9; 

查詢

SELECT XMLELEMENT(
     "Root", 
     XMLAGG(
      XMLELEMENT(
      "Parent", 
      XMLATTRIBUTES(
       p.id, 
       p.attr1 AS "A", 
       p.attr2 AS "B" 
      ), 
      c.child_xml 
      ) 
     ) 
     ).getClobVal() AS xml 
FROM parents p 
     LEFT OUTER JOIN (
     SELECT parent_id, 
       XMLAGG(
        XMLELEMENT(
        "Child", 
        XMLATTRIBUTES(id), 
        attr1 
       ) 
       ) AS child_xml 
     FROM children 
     GROUP BY parent_id 
     ) c 
     ON (p.id = c.parent_id); 

輸出

XML 
------------------------------------------------------------------------------------------- 
<Root><Parent ID="1" A="A.1" B="B.1"><Child ID="1">C.1</Child><Child ID="2">C.2</Child> 
<Child ID="3">C.3</Child></Parent><Parent ID="2" A="A.2" B="B.2"><Child ID="4">C.4</Child> 
<Child ID="5">C.5</Child><Child ID="6">C.6</Child></Parent><Parent ID="3" A="A.3" B="B.3"> 
</Parent><Parent ID="4" A="A.4" B="B.4"><Child ID="7">C.7</Child><Child ID="8">C.8</Child> 
</Parent><Parent ID="5" A="A.5" B="B.5"><Child ID="9">C.9</Child></Parent></Root> 

如果你想在PL/SQL中使用這個然後就去做:

DECLARE 
    p_xml CLOB; 
BEGIN 
    SELECT ... 
    INTO p_xml 
    FROM ...; 

    -- Then use the xml value. 
END; 
/
0

Oracle包含了DBMS_XMLGEN。您可以使用它將查詢結果轉換爲xmltype。在我的例子中,我也使用「CURSOR表達式」。

declare 
    v_xml xmltype; 
begin  
    v_xml := DBMS_XMLGEN.GETXMLTYPE ('select cursor(select x.COLUMN_NAME,x.DATA_TYPE from user_tab_columns x where x.table_name = y.table_name),y.table_name from user_tables y where rownum < 3'); 
    dbms_output.put_line(v_xml.getClobVal()); 
end; 
相關問題