将XML转换为Oracle中的UDT
是否有将XMLType转换为用户定义类型的简单方法?我可以使用下面的方式将UDT转换为XMLType。将XML转换为Oracle中的UDT
select SYS_XMLGEN(pUDT) into param2 from dual;
我不能不过,是找到一个函数,它是使用使用的SYS_XMLGEN相同的映射把它放回该UDT。
我知道这是旧的,但有一种方法可以将XMLType转换回UDT。如果没有提供模式,它将使用Cannonical映射。尽管Gary的观点非常有效,但如果它非常复杂,您可能必须自定义代码,但假设您拥有一个简单对象,则可以简单地完成代码。 (我还没有与所述模式映射也不提前特征发挥各地
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的输出开始。
我在同样的印象。一位同事有一种想法将XML类型传递给UDT的构造函数。尽管整个思维过程都是为了一个新过程而废除的。尽管谢谢你的回答! – Josh 2010-03-12 17:48:31