Joomla 3.1 Templates by FatCow Coupon

Использование пакета DBMS_XMLGEN

Категория: Блог Опубликовано 23.05.2017

XML_GEN используется начиная с oracle 11 g, вызов в прошлых версиях ORCALE sys.xml_gen

Применение пакета XML_GEN
XML_GEN используется для преобразования результатов SQL запроса в, XML формат
результат как возвращается как CLOB, и как xmltype
XML_GEN поддерживает методы работы с контекстом выражения SQL, преобразовывает контекст в XML выражение


Итак, подготовим тестовый запрос для отладки и проверки методов пакета
количество обьектов заданного типа в схеме sys

select count(ao.OBJECT_TYPE) countOBject, ao.OBJECT_TYPE OT , max(ao.CREATED) maxdtcr
from all_objects ao where ao.OWNER = 'SYS' group by OBJECT_TYPE order by OBJECT_TYPE



Функция newContext
создает новый контекст для выражения sql
пример работы

DECLARE
 ctx    dbms_xmlgen.ctxHandle;
 xml    CLOB;
BEGIN
  ctx := dbms_xmlgen.newContext('select sysdate date1 from dual');
  dbms_xmlgen.setRowTag(ctx, 'daterow');
  xml := dbms_xmlgen.getXML(ctx);
  dbms_output.put_line(xml);
  dbms_xmlgen.closeContext(ctx);
END;



Функция closeContext
создает новый контекст для выражения sql
пример работы

DECLARE
 ctx    dbms_xmlgen.ctxHandle;
 xml    CLOB;
BEGIN
  ctx := dbms_xmlgen.newContext('select sysdate date1 from dual');
  dbms_xmlgen.setRowTag(ctx, 'daterow');
  xml := dbms_xmlgen.getXML(ctx);
  dbms_output.put_line(xml);
  dbms_xmlgen.closeContext(ctx);
END;



функция GetsXML
возвращает документ XML по запросу, переданному в функцию в виде тестового праметра
данные возвращаются, а формате clob

пример работы

select DBMS_XMLGEN.getxml ('select sysdate datet from dual ') myxml from dual


результат
---<?xml version="1.0"?>
--<ROWSET>
-- <ROW>
-- <DATET>07.09.12</DATET>
-- </ROW>
--</ROWSET>



select DBMS_XMLGEN.getxml (q'[select count(ao.OBJECT_TYPE) countOBject, ao.OBJECT_TYPE OT , max(ao.CREATED) maxdtcr
  from all_objects ao where owner='SYS' group by OBJECT_TYPE order by OBJECT_TYPE]') myxml
from dual


обратите внимание на волшебный оператор q - оператор экаранирования кавычек
результат
-- <?xml version="1.0"?>
--<ROWSET>
-- <ROW>
-- <COUNTOBJECT>10</COUNTOBJECT>
-- <OT>CLUSTER</OT>
-- <MAXDTCR>10.11.09</MAXDTCR>
-- </ROW>
-- <ROW>
-- <COUNTOBJECT>2</COUNTOBJECT>
-- <OT>CONSUMER GROUP</OT>
-- <MAXDTCR>10.11.09</MAXDTCR>
-- </ROW>
-- <ROW>


--.........


getXMLType Функция
Gets the XML document
возвращает документ XML по запросу
данные возвращаются в формате clob

пример работы

select DBMS_XMLGEN.getxmltype ('select sysdate datet from dual ') myxml from dual



---<?xml version="1.0"?>
--<ROWSET>
-- <ROW>
-- <DATET>07.09.12</DATET>
-- </ROW>
--</ROWSET>

select DBMS_XMLGEN.getxmltype (q'[select count(ao.OBJECT_TYPE) countOBject, ao.OBJECT_TYPE OT , max(ao.CREATED) maxdtcr
  from all_objects ao where owner='SYS' group by OBJECT_TYPE order by OBJECT_TYPE]') myxml
from dual



-- <?xml version="1.0"?>
--<ROWSET>
-- <ROW>
-- <COUNTOBJECT>10</COUNTOBJECT>
-- <OT>CLUSTER</OT>
-- <MAXDTCR>10.11.09</MAXDTCR>
-- </ROW>
-- <ROW>
-- <COUNTOBJECT>2</COUNTOBJECT>
-- <OT>CONSUMER GROUP</OT>
-- <MAXDTCR>10.11.09</MAXDTCR>
-- </ROW>
-- <ROW>
--.........




-- работа с контекстом
-- в функции getxmltype так же можно передавать контекст sql запрос
-- пример работы с контекстом устройства

DECLARE
 ctx    dbms_xmlgen.ctxHandle;
 xml    CLOB;
BEGIN
  ctx := dbms_xmlgen.newContext('select sysdate date1 from dual');
  xml := dbms_xmlgen.getXML(ctx);
  dbms_output.put_line(xml);
  dbms_xmlgen.closeContext(ctx);
END;



-- результат

--<?xml version="1.0"?>
--<ROWSET>
-- <ROW>
-- <DATE1>07.09.12</DATE1>
-- </ROW>
--</ROWSET>


Функция setRowSetTag
устанавливает наименование в XML блока результата
пример работы

DECLARE
 ctx    dbms_xmlgen.ctxHandle;
 xml    CLOB;
BEGIN
  ctx := dbms_xmlgen.newContext('select sysdate date1 from dual');
  dbms_xmlgen.setRowSetTag(ctx, 'daterow');
  xml := dbms_xmlgen.getXML(ctx);
  dbms_output.put_line(xml);
  dbms_xmlgen.closeContext(ctx);
END;



-- результат
--<?xml version="1.0"?>
--<daterow>
-- <ROW>
-- <DATE1>07.09.12</DATE1>
-- </ROW>
--</daterow>



setRowTag Функция
устанавляивает наименование в XML элемент результата ,
то есть возникает дополнительный xml блок для каждого элемента строки

пример работы

DECLARE
 ctx    dbms_xmlgen.ctxHandle;
 xml    CLOB;
BEGIN
  ctx := dbms_xmlgen.newContext('select sysdate date1 from dual');
  dbms_xmlgen.setRowTag(ctx, 'daterow');
  xml := dbms_xmlgen.getXML(ctx);
  dbms_output.put_line(xml);
  dbms_xmlgen.closeContext(ctx);
END;



--<?xml version="1.0"?>
--<ROWSET>
-- <daterow>
-- <DATE1>07.09.12</DATE1>
-- </daterow>
---</ROWSET>

Просмотров: 615