使用 Oracle XMLgen 实用程序使用内存表数据创建 XML

发布于 2024-12-17 05:05:18 字数 1262 浏览 1 评论 0原文

我正在 Oracle 中使用 dbms.xmlgen 实用程序从保存到 Oracle 内存表的数据创建 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.

这也显示错误数字或值错误。

任何人请建议如何实现这一点。

I am using dbms.xmlgen utility in Oracle to create XML document from the data saved to oracle memory table .

My procedure is saving the data in Oracle type ITEM_ARRAY. This is table of ITEM_OBJECT type.

Finally data is there in my ITEM_ARRAY. Now I want to convert this data into XML. So I am using following code

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); 

My this code is returning error that V_ITEMLIST does not exist.

But when I am doing dbms_out like

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);

This is returning values.

I was trying different method like saving V_ITEMLIST into cursor then calling this code as below.

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

where item cursor is

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.

This is also showing error numeric or value error.

Anybody please suggest how to implement this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦巷 2024-12-24 05:05:18

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>

DBMS_XMLGEN.newContext executes a SQL query, but SQL cannot directly access PL/SQL data. The query must call a function that returns the relevant data.

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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文