将XML转换为Oracle中的UDT

问题描述:

是否有将XMLType转换为用户定义类型的简单方法?我可以使用下面的方式将UDT转换为XMLType。将XML转换为Oracle中的UDT

select SYS_XMLGEN(pUDT) into param2 from dual; 

我不能不过,是找到一个函数,它是使用使用的SYS_XMLGEN相同的映射把它放回该UDT。

我知道这是旧的,但有一种方法可以将XMLType转换回UDT。如果没有提供模式,它将使用Cannonical映射。尽管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) 

这是使用“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'); 

我会说在技术上你不能。

例如

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。也就是说,我可能会从SYS_XMLGEN的输出开始。

+0

我在同样的印象。一位同事有一种想法将XML类型传递给UDT的构造函数。尽管整个思维过程都是为了一个新过程而废除的。尽管谢谢你的回答! – Josh 2010-03-12 17:48:31