2012-02-17 45 views
5

Dưới đây là một bảng mẫu:XMLTABLE với Oracle 11g

create table xmltemp (mydoc xmltype) 

Đây là một xml doc nhỏ cho nó:

insert into xmltemp values (
xmltype 
('<?xml version="1.0"?> 
<countries> 
    <country> 
    <name>Canada</name> 
    </country> 
    <country> 
    <name>US</name> 
    <states> 
     <state> 
     <name>Washington</name> 
     <name>Oregon</name>   
     </state> 
    </states> 
    </country> 
</countries> 
') 
) 

ý rằng Canada không có một yếu tố 'bang' nhưng Hoa Kỳ làm. Tôi đang cố gắng để có được những kết quả truy vấn (thứ tự và định dạng là không quan trọng):

Canada, 
US,Washington 
US,Oregon 

Khi tôi thực hiện điều này, tôi thấy cả Canada và Mỹ trong kết quả:

select 
countryname 
from xmltemp, 
xmltable('/countries/country' passing mydoc 
    columns countryname varchar2(10) path 'name') 

Khi tôi làm điều này, tôi nhận được cả hai trạng thái:

select 
statename 
from xmltemp, 
xmltable('/countries/country/states/state/name' passing mydoc 
    columns statename varchar2(20) path '.') c 

tôi đã cố gắng này để có được cả hai nước và khẳng định, nhưng có vẻ như oracle không thích '..' cú pháp:

select 
statename 
from xmltemp, 
xmltable('/countries/country/states/state/name' passing mydoc 
    columns statename varchar2(20) path '.', 
      countryname varchar2(20) path '../../../name') c 

Heres lỗi:

ORA-19110: unsupported XQuery expression 

Khi tôi cố gắng này, tôi nhận được lỗi 'đa mục' vì hai trạng thái:

select 
countryname, 
statename 
from xmltemp, 
xmltable('/countries/country' passing mydoc 
    columns countryname varchar2(10) path 'name', 
      statename varchar2(20) path 'states/state/name') c 

Đây là lỗi mà:

ORA-19279: XPTY0004 - XQuery dynamic type mismatch: expected singleton 
sequence - got multi-item sequence 

Truy vấn sẽ giúp tôi đạt được kết quả mong muốn của mình là:

Canada, 
US,Washington 
US,Oregon 

Cảm ơn

Trả lời

4

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

select  X.COUNTRYNAME, Y.STATENAME 
from  XMLTEMP 
      ,xmltable('/countries/country' 
        passing MYDOC 
        columns COUNTRYNAME varchar2(20) path './name', 
          STATES xmltype path './states') X, 
      xmltable('/states/state/name' passing X.STATES 
        columns STATENAME varchar2(20) path '.') (+) Y 

Bởi vì bạn có nhiều tiểu bang bạn nên tham gia vào một bảng xml. Vì một số quốc gia không có quốc gia nên cần phải tham gia bên ngoài. Tôi đang sử dụng phương pháp cũ của (+) như tôi đang cố gắng này trên 10g và có vẻ như có một vấn đề bằng cách sử dụng left outer join trong 10g nhưng dường như nó sẽ là tốt trong 11g.

+0

Cảm ơn. Tôi đã xem xét việc tham gia bên ngoài ngày hôm qua, nhưng không thể tìm ra nó. Mặc dù chúng không cụ thể đối với Oracle, tôi cũng thấy rằng hai liên kết này cũng hữu ích: [Phần 1] (http://www.ibm.com/developerworks/data/library/techarticle/dm-0708nicola/) [Phần 2] (http : //www.ibm.com/developerworks/data/library/techarticle/dm-0709nicola/) – John

+1

Điều này dường như là câu trả lời đúng vì tôi không thể tìm thấy 11g hỗ trợ địa chỉ cha mẹ trong bất kỳ hình thức nào trong mệnh đề PATH. Về cơ bản, những gì đang được thực hiện ở đây là các bản ghi cha được nạp vào một XMLTABLE với các phần tử con chứa bên trong một cột XMLTYPE trong kết quả đó. Sau đó, sử dụng cột con XMLTYPE từ các bản ghi cha, tải các bản ghi con vào một XMLTABLE khác. Oracle sau đó ngầm tham gia tất cả các bảng. --- Những gì tôi đang tìm kiếm, tuy nhiên là 11g không bên ngoài tham gia đúng với chỉ một (+), tôi phải đặt (+) trên cả hai bảng x và y, mà không có ý nghĩa nhiều. – juanitogan

+0

Một điều kỳ lạ khác mà tôi tìm thấy với 11g là tôi không thể xử lý các phần tử theo thuộc tính cụ thể như mong đợi khi sử dụng xmlnamespace mặc định. Giải pháp thay thế là giải quyết thuộc tính với không gian tên ký tự đại diện (không gian tên rõ ràng không hoạt động). Ví dụ: không hoạt động: PATH 'ID [@ type = "user"]'. Không hoạt động: PATH 'ID [@foo: type = "user"]'.Tác phẩm: PATH 'ID [@ *: type = "user"]'. – juanitogan

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