Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Oracle中将XML转换为UDT_Oracle - Fatal编程技术网

在Oracle中将XML转换为UDT

在Oracle中将XML转换为UDT,oracle,Oracle,有没有一种简单的方法可以将XMLType转换为用户定义的类型?我可以使用以下命令将UDT转换为XMLType select SYS_XMLGEN(pUDT) into param2 from dual; 但是,我不能找到一个函数,它使用SYS\u XMLGEN使用的映射将其转换回UDT。我认为从技术上讲,你不能 比如说 select sys_xmlgen(mdsys.sdo_geometry(1,2,mdsys.sdo_point_type(1,2,3),null,null)) from d

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

select SYS_XMLGEN(pUDT) into param2 from dual;

但是,我不能找到一个函数,它使用SYS\u XMLGEN使用的映射将其转换回UDT。

我认为从技术上讲,你不能

比如说

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>

1.
2.
1.
2.
3.
XML中没有任何东西表明(a)它是mdsys.sdo_几何体类型,或者(b)mdsys模式中的子对象sdo_GTYPE等


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

我知道这很旧,但有一种方法可以将XMLType转换回UDT。如果没有提供模式,它将使用cannonical映射

虽然Gary的观点是绝对正确的,但如果它变得非常复杂,您可能需要对其进行自定义编码,但只要您有一个简单的对象,就可以简单地完成它!(我没有使用模式映射和advance特性

现在输出:

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传递给UDT的构造函数。我们放弃了整个思考过程,换了一个新的。不过谢谢你的回答!
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)
xx.toobject(xxx,'http://schema/doc','RootDoc');