2010-03-11 72 views
2

是否有將XMLType轉換爲用戶定義類型的簡單方法?我可以使用下面的方式將UDT轉換爲XMLType。將XML轉換爲Oracle中的UDT

select SYS_XMLGEN(pUDT) into param2 from dual; 

我不能不過,是找到一個函數,它是使用使用的SYS_XMLGEN相同的映射把它放回該UDT。

回答

2

我知道這是舊的,但有一種方法可以將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'); 
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。也就是說,我可能會從SYS_XMLGEN的輸出開始。

+0

我在同樣的印象。一位同事有一種想法將XML類型傳遞給UDT的構造函數。儘管整個思維過程都是爲了一個新過程而廢除的。儘管謝謝你的回答! – Josh 2010-03-12 17:48:31