2011-11-21 80 views
2

我在Oracle中使用dbms.xmlgen實用程序從保存到Oracle內存表的數據創建XML文檔。使用Oracle XMLgen Utility創建XML使用內存表數據

我的程序正在將數據保存在Oracle類型ITEM_ARRAY中。這是ITEM_OBJECT類型的表格。

最後的數據是在我的ITEM_ARRAY。現在我想將這些數據轉換成XML。所以我使用下面的代碼

ctx:= DBMS_XMLGEN.newContext(' SELECT * FROM TABLE(CAST(V_ITEMLIST AS ITEM_ARRAY)) where (ITEM_NO is not null or trim(ITEM_NO) is not null) order by ITEM_NO,PARTYABBRVCODE '); 
DBMS_XMLGEN.setRowTag (ctx, 'itembom'); 
DBMS_XMLGEN.setRowSetTag (ctx, 'itemboms'); 
xmldoc := DBMS_XMLGEN.getXML(ctx); 

我的這段代碼返回錯誤,V_ITEMLIST不存在。

但是當我做dbms_out像

For I In 1..V_Itemlist.Count Loop 
Dbms_Output.Put_Line('Partyabbrvcode '||V_Itemlist(I).Partyabbrvcode); 
DBms_Output.Put_Line('Item_No'||V_Itemlist(I).Item_No); 

這是返回值。

我正在嘗試不同的方法,如將V_ITEMLIST保存到遊標中,然後如下調用該代碼。

ctx := dbms_xmlgen.newContext (ITEMCUR); 
xmldoc := DBMS_XMLGEN.getXML(ctx); 
DBMS_XMLGEN.closeContext(ctx); 

其中項光標是

SELECT * FROM TABLE(CAST(V_ITEMLIST AS ITEM_ARRAY)) where (ITEM_NO is not null or trim(ITEM_NO) is not null) order by ITEM_NO,PARTYABBRVCODE. 

這也示出了錯誤數值或數值誤差。

有人請建議如何實現這一點。

+1

歡迎來到StackOverflow。多行代碼不使用任何引號來進行格式化,只是縮進。只需插入代碼,選擇它並點擊'{}'按鈕。並且使用全部大寫字母被認爲是不好的風格。我解決了這兩個問題。 – Codo

回答

0

DBMS_XMLGEN.newContext執行SQL查詢,但SQL無法直接訪問PL/SQL數據。查詢必須調用返回相關數據的函數。

SQL> set long 1000 
SQL> 
SQL> create or replace package xml_package as 
    2  type varchar2_table is table of varchar2(100); 
    3  function get_items return varchar2_table pipelined; 
    4  function get_xml return clob; 
    5 end; 
    6/

Package created. 

SQL> 
SQL> create or replace package body xml_package as 
    2  g_items varchar2_table := varchar2_table(); 
    3 
    4  function get_items return varchar2_table pipelined is 
    5  begin 
    6    for i in 1 .. g_items.count loop 
    7      pipe row(g_items(i)); 
    8    end loop; 
    9  end; 
10 
11  function get_xml return clob is 
12    v_xml clob; 
13    v_context number; 
14  begin 
15    g_items := varchar2_table('item1', 'item2', 'item3'); 
16    v_context := dbms_xmlgen.newContext(
17      'select * from table(xml_package.get_items)'); 
18    v_xml := dbms_xmlgen.getXML(v_context); 
19    return v_xml; 
20  end; 
21 end; 
22/

Package body created. 

SQL> 
SQL> select xml_package.get_xml from dual; 

GET_XML 
------------------------------------------------------------------------------- 
<?xml version="1.0"?> 
<ROWSET> 
<ROW> 
    <COLUMN_VALUE>item1</COLUMN_VALUE> 
</ROW> 
<ROW> 
    <COLUMN_VALUE>item2</COLUMN_VALUE> 
</ROW> 
<ROW> 
    <COLUMN_VALUE>item3</COLUMN_VALUE> 
</ROW> 
</ROWSET>