Я знаю, что это старый, но есть способ конвертировать XMLType обратно в UDT. Он будет использовать каноническое отображение, если схема не предоставлена.
Хотя точка зрения Гэри определенно верна, вам, возможно, придется настраивать ее, если она становится достаточно сложной, но это можно сделать просто, если у вас есть простой объект! (Я не играл ни с отображением схемы, ни с расширенными функциями.
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');