2014-06-18 56 views
0

我有一个列表,里面有一个列表类型属性(地址)。我发送整个信息作为数据库中的XML来更新/插入我的oracle表中的细节。解析存储过程中的xml oracle

这里是XML格式

 DECLARE 
    x XMLType := XMLType(' 

    <person> 
    <row>  
    <name>Tom</name>  
    <Address>   
    <LocalAddress>   
    <State>California</State>   
    <City>Los angeles</City>   
    </LocalAddress>   
    <LocalAddress>   
    <State>California1</State>   
    <City>Los angeles1</City>   
    </LocalAddress>  
    </Address> 
    </row> 
    <row>  
    <name>Jim</name>  
    <Address>  
    <LocalAddress> 
    <State>California</State>   
    <City>Los angeles</City>  
    </LocalAddress> 
    </Address> 
    </row> 
    </person>'); 
    v_person_name varchar2(1000); 
    v_city varchar2(1000); 
    BEGIN 
     FOR xmlrow IN 
     (SELECT column_value AS xml 
     FROM TABLE(XMLSequence(x.extract('/person/row'))) 
    ) 
    LOOP 
     SELECT extractValue(xmlrow,'/row/name/text()') 
     INTO v_person_name 
     FROM dual; 
     DBMS_OUTPUT.put_line(v_person_name); 
     FOR address IN 
     (SELECT column_value AS xml 
     FROM TABLE(xmlsequence(xmlrow.extract('/row/Address/LocalAddress'))) 
    ) 
     LOOP 
     -- extract address values same as above. 
     SELECT extractValue(xmlrow,'/LocalAddress/City/text()') 
     INTO v_city 
     FROM dual; 
     DBMS_OUTPUT.put_line(v_city); 
     END LOOP; 
    END LOOP; 
    END; 

如何可以解析:在Oracle中整个XML?我发送这个xmltype变量。

这是给我一个comilation错误

Error report - 
ORA-06550: line 35, column 27: 
PLS-00382: expression is of wrong type 
ORA-06550: line 35, column 14: 
PL/SQL: ORA-00932: inconsistent datatypes: expected - got - 
ORA-06550: line 35, column 7: 
PL/SQL: SQL Statement ignored 
ORA-06550: line 41, column 37: 
PLS-00302: component 'EXTRACT' must be declared 
ORA-06550: line 41, column 37: 
PLS-00302: component 'EXTRACT' must be declared 
ORA-06550: line 41, column 30: 
PL/SQL: ORA-00904: "XMLROW"."EXTRACT": invalid identifier 
ORA-06550: line 40, column 7: 
PL/SQL: SQL Statement ignored 
ORA-06550: line 45, column 29: 
PLS-00382: expression is of wrong type 
ORA-06550: line 45, column 16: 
PL/SQL: ORA-00932: inconsistent datatypes: expected - got - 
ORA-06550: line 45, column 9: 
PL/SQL: SQL Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 

请帮我解决这个问题。 在此先感谢。

回答

2

我能够使用这种方法

SET serveroutput ON format wrapped; 
DECLARE 
    x XMLType := XMLType(' 
<person> 
<row>  
<name>Tom</name>  
<Address>   
<LocalAddress>   
<State>California</State>   
<City>Los angeles</City>   
</LocalAddress>   
<LocalAddress>   
<State>California1</State>   
<City>Los angeles1</City>   
</LocalAddress>  
</Address> 
</row> 
<row>  
<name>Jim</name>  
<Address>  
<LocalAddress> 
<State>California</State>   
<City>Los angeles</City>  
</LocalAddress> 
</Address> 
</row> 
</person>'); 
BEGIN 
    FOR r IN 
    (SELECT ExtractValue(Value(p),'/row/name/text()') AS name , 
    Extract(Value(p),'/row/Address') As Address 
    FROM TABLE(XMLSequence(Extract(x,'/person/row'))) p 
) 
    LOOP 
    DBMS_OUTPUT.put_line(r.name); 
    FOR row1 IN 
    (SELECT ExtractValue(Value(l),'/LocalAddress/City/text()') AS city 
    FROM TABLE(XMLSequence(Extract(r.Address,'/Address/LocalAddress'))) l 
    ) 
    LOOP 

     DBMS_OUTPUT.put_line(row1.city); 
     -- do whatever you want with r.name, r.state, r.city 
    END LOOP; 
    -- do whatever you want with r.name, r.state, r.city 
    END LOOP; 
END; 
0

当您使用XML类型时,我假设您需要访问单个标签及其各自的值。下面是一段代码示例,它将根据上述XML结构从每行中选择名称。注意:xml_in只是存储过程中xmltype变量的变量名称。

select extractValue(column_value,'/row/name/text()') as name 
from table (XMLSequence(xml_in.extract('/person/row'))); 

如果你需要做的嵌套解析,你也可以这样做:

for xmlrow in (select column_value as xml from table(xmlsequence(xml_in.extract('/person/row'))))) loop 

    select extractValue(xmlrow.xml,'/row/name/text()') 
    into v_person_name 
    from dual; 

    for address in (select column_value as xml from table(xmlsequence(xmlrow.xml.extract('/row/Address/LocalAddress')))) loop 
     -- extract address values same as above. 
    end loop; 
end loop; 
+0

感谢解析嵌套的XML,但如何提取地址部分。 – user1685652

+0

只需使用XPath即可。所以extractValue(column_value,'/ row/Address/LocalAddress/State/text()')等等。 – Nick

+0

它是一个动态的XML,我不知道有多少本地地址我可以得到内部地址。 – user1685652