在Oracle中将XML转换为UDT

时间:2010-03-11 16:03:15

标签: oracle

有没有简单的方法将XMLType转换为用户定义的类型?我可以使用下面的方法将UDT转换为XMLType。

select SYS_XMLGEN(pUDT) into param2 from dual;

我不能,但是,找到一个函数,使用与SYS_XMLGEN使用的相同映射将其转换回UDT。

2 个答案:

答案 0 :(得分:2)

我知道这是旧的,但有一种方法可以将XMLType转换回UDT。如果没有提供架构,它将使用cannonical mapping。

虽然Gary的观点肯定是有效的,但如果它变得非常复杂,你可能需要自定义代码,但是只要假设你有一个简单的对象就可以做到这一点! (我没有使用模式映射和高级功能。

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)

这是使用XmlType的“toObject”。 以下是我在此主题中找到的一些其他链接: 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

修改

这对我来说比其他人更多{因为最初的答案是'它不能' - &gt;哪个是可以的,即使对于复杂的类型},但我不得不在一个非常复杂的xml / xsd文档上使用带有模式的xmltype.toobject,它就像宣传的那样工作(包括创建数组类型(和类型内的类型等) )

xx.toobject(xxx,'http://schema/doc','RootDoc');

答案 1 :(得分:1)

我认为技术上你不能。

例如

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中没有任何内容表示(a)它是mdsys.sdo_geometry类型,或者(b)子对象SDO_GTYPE等在MDSYS模式中。

我认为你需要自己的方法对象类型(或你自己的函数,如果你没有控制目标代码,如MDSYS)将对象转换为XML或从XML转换。也就是说,我可能从SYS_XMLGEN的输出开始。