Конвертировать XML в UDT в Oracle - PullRequest
2 голосов
/ 11 марта 2010

Есть ли простой способ преобразовать XMLType в пользовательский тип? Я могу преобразовать UDT в XMLType, используя ниже.

select SYS_XMLGEN(pUDT) into param2 from dual;

Я не могу, однако, найти функцию, которая принимает это и превращает его обратно в тот UDT, используя те же отображения, которые использовал SYS_XMLGEN.

Ответы [ 2 ]

2 голосов
/ 04 марта 2011

Я знаю, что это старый, но есть способ конвертировать XMLType обратно в UDT. Он будет использовать каноническое отображение, если схема не предоставлена.

Хотя точка зрения Гэри определенно верна, вам, возможно, придется настраивать ее, если она становится достаточно сложной, но это можно сделать просто, если у вас есть простой объект! (Я не играл ни с отображением схемы, ни с расширенными функциями.

xmlType.ToObject

create OR REPLACE type udtToXmlAndBack AS OBJECT(AA varchar2(50) , BB NUMBER);

variable x refcursor

SET SERVEROUTPUT ON
DECLARE 
    pUDT udtToXmlAndBack;
    newUDTFromXml udtToXmlAndBack;
    xData xmlType ;
BEGIN
    pUDT := NEW udtToXmlAndBack('ABC',10) ;
    DBMS_OUTPUT.PUT_LINE('pUDT.AA = ' || pUDT.AA || '; pUDT.BB = ' || pUDT.BB); 
    SELECT SYS_XMLGEN(pUDT) into xData FROM DUAL;
    xData.toobject(newUDTFromXml);
    DBMS_OUTPUT.PUT_LINE('newUDTFromXml.AA = ' || newUDTFromXml.AA || '; newUDTFromXml.BB = ' || newUDTFromXml.BB); 
    open :x for
    select pUDT initUDT, xData xmlData,newUDTFromXml udtFromXML from dual;
END ;
/

PRINT :X;

и теперь вывод:

anonymous block completed
pUDT.AA = ABC; pUDT.BB = 10
newUDTFromXml.AA = ABC; newUDTFromXml.BB = 10

X
------------------------------------
INITUDT                             
------------------------------------
mySchema.UDTTOXMLANDBACK('ABC',10)       

--------------------
xmlData   
--------------------
<?xml version="1.0"?>
<ROW>
 <AA>ABC</AA>
 <BB>10</BB>
</ROW>

--------------------
UDTFROMXML          
--------------------
mySchema.UDTTOXMLANDBACK('ABC',10)

Это использует ' toObject ' из XmlType. Вот несколько других ссылок, которые я нашел на эту тему: http://technology.amis.nl/blog/6131/oracle-sql-and-plsql-juggling-with-user-defined-types-adt-and-xmltype-for-creating-an-adt-based-xml-service-api & http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:19049264697122

редактировать

для меня это больше, чем для кого-либо еще {поскольку первоначальный ответ - «это невозможно» -> что может, даже для сложных типов}, но мне пришлось использовать объект xmltype.toobject со схемой на довольно сложном XML / XSD документ, и он работал как рекламируется (включая создание типов массивов (и тип в типе в типе и т. д.)

xx.toobject(xxx,'http://schema/doc','RootDoc');
1 голос
/ 12 марта 2010

Я бы сказал, что технически вы не можете.

Например

select sys_xmlgen(mdsys.sdo_geometry(1,2,mdsys.sdo_point_type(1,2,3),null,null)) 
from dual;

возвращает

<?xml version="1.0"?>
<ROW>
  <SDO_GTYPE>1</SDO_GTYPE>
  <SDO_SRID>2</SDO_SRID>
  <SDO_POINT>
    <X>1</X>
    <Y>2</Y>
    <Z>3</Z>
  </SDO_POINT>
</ROW>

и в XML нет ничего, что указывало бы либо на то, (а) что это тип mdsys.sdo_geometry, либо (б) подобъекты SDO_GTYPE и т. Д. В схеме MDSYS.

Я думаю, что вам нужны ваши собственные методы для типа объекта (или собственные функции, если у вас нет контроля над объектным кодом, например, MDSYS), который преобразует объект в / из XML. Тем не менее, я бы, вероятно, начал с вывода SYS_XMLGEN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...