, ,

Формирование заголовок для XML в ORACLE DB

пятница, 5 июня 2009 г. Оставить комментарий

Столкнулся с проблемой, что в ORACLE DB нет "правильной" функции для формирования xml заголовка. Кажется в 10.2 появилась функция XMLRoot , но в фукции нельзя указать кодировку xml, а хотелось бы добавить заголовок подобного типа.


<?xml version="1.0" encoding="windows-1251"?>

Заголовок можно конкатенировать к xml, но существуют ограничения по длине в 32K.
Поэтому пришлось написать свою функцию для добавления заголовка.

create or replace package body xml_api is

function add_xml_root( ps_root varchar2
,pcl_body clob
) return clob
is
vcl_temp clob;
begin
dbms_lob.createtemporary(vcl_temp, true, dbms_lob.session);

dbms_lob.open(vcl_temp, DBMS_LOB.LOB_READWRITE);
dbms_lob.writeappend(vcl_temp, length(ps_root), ps_root);
dbms_lob.append(vcl_temp, pcl_body);
dbms_lob.close(vcl_temp);

return vcl_temp;
end add_xml_root;

end xml_api;

Посмотрим результат на данных их схемы SCOTT.

select xml_api.add_xml_root('<?xml version="1.0" encoding="windows-1251"?>',
xmlelement(employee_list,
xmlagg(xmlelement(employee,
xmlattributes(emp.empno, emp.ename)))).getclobval())
from emp;



<?xml version="1.0" encoding="windows-1251"?>
<EMPLOYEE_LIST>
<EMPLOYEE EMPNO="7369" ENAME="SMITH"/>
<EMPLOYEE EMPNO="7499" ENAME="ALLEN"/>
<EMPLOYEE EMPNO="7521" ENAME="WARD"/>
<EMPLOYEE EMPNO="7566" ENAME="JONES"/>
<EMPLOYEE EMPNO="7654" ENAME="MARTIN"/>
<EMPLOYEE EMPNO="7698" ENAME="BLAKE"/>
<EMPLOYEE EMPNO="7782" ENAME="CLARK"/>
<EMPLOYEE EMPNO="7788" ENAME="SCOTT"/>
<EMPLOYEE EMPNO="7839" ENAME="KING"/>
<EMPLOYEE EMPNO="7844" ENAME="TURNER"/>
<EMPLOYEE EMPNO="7876" ENAME="ADAMS"/>
<EMPLOYEE EMPNO="7900" ENAME="JAMES"/>
<EMPLOYEE EMPNO="7902" ENAME="FORD"/>
<EMPLOYEE EMPNO="7934" ENAME="MILLER"/>
</EMPLOYEE_LIST>

1 коммент. »

  • Анонимно пишет:  

    C сайта SQL.ru:

    SQL> select XMLROOT (XMLElement("dataroot",
    2 (select XMLAgg(
    3 XMLElement("WORK",
    4 XMLAttributes(
    5 'name' as "NAME",
    6 'id' as "ID" )))
    7 from dual)), version '1.0" encoding="windows-1251').getStringVal() from dual
    8 ;

    XMLROOT(XMLELEMENT("DATAROOT",
    --------------------------------------------------------------------------------

  • Оставьте Ваш комментарий