2012-02-28 47 views
0

我對Oracle數據庫和PL/SQL有相當的業餘愛好,但仍然需要與Oracle DB進行接口。從Oracle PL/SQL多級集合中生成XML

我有一個PL/SQL存儲過程,其具有一輸出參數,該參數是多級集合:

declare 
TYPE level_a_type IS RECORD 
(
    text varchar2(6), 
    data number 
); 
TYPE level_a_table IS TABLE of level_a_type INDEX BY PLS_INTEGER; 
TYPE level_b_type IS RECORD 
(
    value number, 
    included_table level_a_table 
); 
TYPE level_b_table IS TABLE of level_b_type INDEX BY PLS_INTEGER; 

我所說的程序,並在stdout手動生成XML這樣

set serveroutput on 
declare 
    result level_b_type; 
    n integer; 
begin 
    n := mypackage.mystoredprocedure(result); 
FOR i IN 1 .. result.count LOOP 
    dbms_output.putline('<levelb value="'||result(i).level_b_value||'" >'); 
    FOR k IN 1 .. result(i).included_table.count LOOP 
     dbms_output.putline('<levela text="'||result(i).included_table(k).text||'" data="'||result(i).included_table(k).data||" '/>'); 
    END LOOP; 
    dbms_output.putline('</levelb>'); 
END LOOP; 
end; 

然而,這是非常麻煩的維護。那麼,有沒有PL/SQL的快捷方式來做類似XML_gen(result)這樣的事情,將回溯到level_b_table並自動生成這樣的東西?

<levelb value="1"> 
<levela text="Hello" data="1" /> 
<levela text="World" data="2" /> 
</levelb> 

回答

2

我在這種情況下做的是創建一個包含所需數據的對象關係視圖。也就是說,

create view level_b_v of level_b_table with object identifier (value) as 
select <level b stuff>, 
    cast (multiset (select <level a stuff>) as level_a_table; 

然後我用DBMS_XMLGEN選擇從視圖中的多XML(非常簡單,只是「選擇level_b_v *」。

而且,如果需要的話,使用dbms_xslprocessor應用樣式表。這是一個使用大量內存的DOM操作(並且將資源用作行大小的四倍),但是如果您的變換非常集中,您可以讓DBMS_XMLGEN選擇數據塊並進行處理。

您需要唯一的對象標識符爲視圖而且你需要創建類型,但是你已經完成了。

當然還有其他方法,但對於中等大小的數據,這對我們非常有用,在分層和400 MB的XML中高達約10個級別。

0

沒有太大的幫助,我知道,但有一個看看 Oracle XML DB文檔。 Oracle提供了許多功能來創建/操作XML文檔。

+0

我不認爲有一個簡單和容易的方法來從上面的多級集合生成XML。你可以在表格中訪問這些數據嗎?如果是的話,可以使用一些SQL函數來生成XML。 – 2012-02-28 13:54:48

+0

是的,我已經看到了直接從「SELECT ... FROM ...」語句生成XML的可能性。不幸的是,這不是我的情況。 – fawick 2012-02-28 14:01:32