2011-11-21 48 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>