有没有简单的方法将XMLType转换为用户定义的类型?我可以使用下面的方法将UDT转换为XMLType。
select SYS_XMLGEN(pUDT) into param2 from dual;
我不能,但是,找到一个函数,使用与SYS_XMLGEN使用的相同映射将其转换回UDT。
答案 0 :(得分:2)
我知道这是旧的,但有一种方法可以将XMLType转换回UDT。如果没有提供架构,它将使用cannonical mapping。
虽然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)
这是使用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的输出开始。