2011-02-03 36 views
10

Tôi mới ở Oracle và tôi - có thể tầm thường - một vấn đề trong một lựa chọn. (Tôi đang sử dụng Oracle 10g Express Edition).Oracle 10g: Trích xuất dữ liệu (chọn) từ XML (Loại CLOB)

Tôi đã một DB với một CLOB lĩnh vực: mytab.xml Cột này có một XML như thế này:

<?xml version="1.0" encoding="iso-8859-1"?> 
<info> 
<id> 954 </id> 
<idboss> 954 </idboss> 
<name> Fausto </name> 
<sorname> Anonimo </sorname> 
<phone> 040000000 </phone> 
<fax> 040000001 </fax> 
</info> 

Tôi đang cố gắng để làm một 'đơn giản' chọn để có được, ví dụ, giá trị của thẻ 'fax'. Nhưng tôi có một chút vấn đề và tôi không thể hiểu được lỗi của mình. Ví dụ:

select extract(xml, '//fax').getStringVal() from mytab; 
ORA-00932: inconsistent datatypes: expected - got 

select extract(xmltype(xml), '//fax').getStringVal() from mytab; 
ORA-06502: PL/SQL: numeric or value error 
ORA-06512: at "SYS.XMLTYPE", line 254 

Tôi cũng đã thử với 'extractvalue', nhưng tôi cũng gặp vấn đề tương tự. nơi tôi sai khi thực hiện việc này?

Trả lời

27

Hãy thử điều này thay vì:

select xmltype(t.xml).extract('//fax/text()').getStringVal() from mytab t 
+0

chưa: ORA-06.502: PL/SQL: số hoặc giá trị lỗi ORA-06.512: tại "SYS.XMLTYPE", dòng 254 ORA-06512: tại dòng 1 – mymark

+0

Xin lỗi .... vâng, câu trả lời của bạn hoạt động hoàn hảo! Trong trường hợp trước tôi đã có một xml null ^^! – mymark

+0

Trong 11g tôi có thể để '.getStringVal()' -part ra. Không có ý tưởng về 10g như tôi không có bất kỳ ở đây. – user272735

3

Hãy thử sử dụng xmltype.createxml(xml).

Như trong,

select extract(xmltype.createxml(xml), '//fax').getStringVal() from mytab; 

Nó làm việc cho tôi.

Nếu bạn muốn cải thiện hoặc thao tác hơn nữa.

Hãy thử một cái gì đó như thế này.

Select * 
from xmltable(xmlnamespaces('some-name-space' as "ns", 
            'another-name-space' as "ns1", 
          ), 
        '/ns/ns1/foo/bar' 
        passing xmltype.createxml(xml) 
        columns id varchar2(10) path '//ns//ns1/id', 
          idboss varchar2(500) path '//ns0//ns1/idboss', 
          etc.... 

        ) nice_xml_table 

Hy vọng nó sẽ giúp ai đó.

0

truy vấn này chạy hoàn hảo trong trường hợp của tôi

select xmltype(t.axi_content).extract('//Lexis-NexisFlag/text()').getStringVal() from ax_bib_entity t 
0

Bạn có thể đạt được với bên dưới truy vấn

  1. select extract(xmltype(xml), '//fax/text()').getStringVal() from mytab;

  2. select extractvalue(xmltype(xml), '//fax') from mytab;

0

Bạn có thể thử tạo đối tượng DBMS_XMLPARSER.parser từ XML CLOB và nhận một đối tượng DBMS_XMLDOM.DOMDocument từ nó. Sau đó, sử dụng các phương thức gói DBMS_XMLDOM để lấy giá trị của bất kỳ nút nào.

xml_   CLOB := 'X'; 
    p    DBMS_XMLPARSER.parser; 
    doc_   DBMS_XMLDOM.DOMDocument; 

     -- Convert the CLOB into a XML-document 
     P := DBMS_XMLPARSER.newparser(); 
     -- Parse the clob and get the XML-document 
     DBMS_XMLPARSER.parseclob(p, xml_); 
     doc_ := DBMS_XMLPARSER.getDocument(p); 

Sau đó sử dụng các phương pháp dưới đây để trích xuất giá trị nút

DBMS_XMLDOM.getElementsByTagName (doc_, 'nodename'); DBMS_XMLDOM.GetNodeValue (node_obj_);

Tham khảo thêm về các phương pháp DBMS_XMLDOM here.

0

Trong trường hợp:

<?xml version="1.0" encoding="iso-8859-1"?> 
<info xmlns="http://namespaces.default" xmlns:ns2="http://namespaces.ns2" > 
    <id> 954 </id> 
    <idboss> 954 </idboss> 
    <name> Fausto </name> 
    <sorname> Anonimo </sorname> 
    <phone> 040000000 </phone> 
    <fax> 040000001 </fax> 
</info> 

Query:

Select * 
from xmltable(xmlnamespaces(default 'http://namespaces.default' 
           'http://namespaces.ns2' as "ns", 
         ), 
       '/info' 
       passing xmltype.createxml(xml) 
       columns id varchar2(10) path '/id', 
         idboss varchar2(500) path '/idboss', 
         etc.... 

       ) nice_xml_table 
Các vấn đề liên quan