Создание XML с использованием Oracle XMLgen Utility Использование данных в памяти - PullRequest
2 голосов
/ 21 ноября 2011

Я использую в Oracle утилиту dbms.xmlgen для создания XML-документа из данных, сохраненных в таблице памяти Oracle.

Моя процедура сохранения данных в типе 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 Ответ

0 голосов
/ 23 ноября 2011

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...