Tôi có mảnh sau của XML:Sử dụng XMLTABLE và XQuery để trích xuất dữ liệu từ xml
<per:Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.something.com/2014/11/bla/webservice.xsd"
xmlns:per="http://www.something.com/2014/11/bla/person">
<per:Initials>E.C.</per:Initials>
<per:FirstName>Erik</per:FirstName>
<per:LastName>Flipsen</per:LastName>
<per:BirthDate>1980-07-01</per:BirthDate>
<per:Gender>Male</per:Gender>
</per:Person>
Từ xml này tôi muốn trích xuất một số dữ liệu trong PL/SQL. Tôi muốn sử dụng XMLTABLE, vì các hàm EXTRACT và EXTRACTVALUE không được chấp nhận.
tôi có thể trích xuất các dữ liệu sử dụng truy vấn này:
select pers.Initials,
pers.Firstname
into lsInitials,
lsFirstname
from
XMLTABLE ('*:Person' passing pxRequest
columns Initials PATH '*:Initials',
Firstname PATH '*:FirstName'
) pers;
Tôi đang sử dụng ký tự đại diện cho các không gian tên kể từ khi tôi không thực sự quan tâm những gì chữ viết tắt bên gửi được sử dụng cho các không gian tên, tôi biết con đường chính xác nơi để lấy dữ liệu của tôi.
Với mã này, tôi có hai điều mà câu đố tôi:
- Theo tài liệu trên http://docs.oracle.com/database/121/SQLRF/functions268.htm#SQLRF06232 PATH nên không bắt buộc, tuy nhiên, ngay sau khi tôi loại bỏ các PATH từ phần COLUMNS, tôi không nhận được bất kỳ kết quả nào nữa.
Edit:
tôi phát hiện ra rằng khi tôi loại bỏ các không gian tên cho các yếu tố, và làm cho họ chữ hoa, nó hoạt động. Vì vậy, có vẻ như các tên cột cần phải khớp với các tên phần tử xml để làm cho nó hoạt động. Tôi chưa tìm ra cách làm cho nó hoạt động với XML không gian tên.
- Tài liệu cũng ghi chú "Đối với mỗi cột kết quả ngoại trừ cột FOR ORDINALITY, bạn phải chỉ định loại dữ liệu cột", tuy nhiên, có vẻ như hoạt động tốt mà không có nó. Nó cũng có vẻ hơi dư thừa để chỉ định nó cho các cột và cho các biến tôi đang tìm nạp dữ liệu vào. Bất kỳ ý tưởng nếu không chỉ định các loại dữ liệu có thể làm cho tôi gặp rắc rối?
mẫu mã Runnable:
SET SERVEROUTPUT ON;
DECLARE
pxRequest xmltype := xmltype('<per:Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.something.com/2014/11/bla/webservice.xsd"
xmlns:per="http://www.something.com/2014/11/bla/person">
<per:Initials>E.C.</per:Initials>
<per:FirstName>Erik</per:FirstName>
<per:LastName>Flipsen</per:LastName>
<per:BirthDate>1980-01-01</per:BirthDate>
<per:Gender>Male</per:Gender>
</per:Person>');
lsInitials varchar2(100);
lsFirstname varchar2(100);
begin
select pers.Initials,
pers.Firstname
into lsInitials,
lsFirstname
from
XMLTABLE ('*:Person' passing pxRequest
columns Initials PATH '*:Initials',
Firstname PATH '*:FirstName'
) pers;
dbms_output.put_line(lsInitials);
dbms_output.put_line(lsFirstname);
end;