Tôi sẽ trích xuất dữ liệu theo từng giai đoạn:
SELECT xobjects.id, xobjects.name, xrows.index_id,
xrows.provider_id_description, xrows.provider_id
FROM XMLTABLE(
'/AuxiliaryType/AuxiliaryObject'
PASSING xmltype(
'<AuxiliaryType>
<AuxiliaryObject id="1" NAME="Provider_P107">
<Row>
<Index_id>1</Index_id>
<Provider_ID_description>GNRCN</Provider_ID_description>
<Provider_ID>GNRCN</Provider_ID>
</Row>
<Row>
<Index_id>2</Index_id>
<Provider_ID_description>EGUT12</Provider_ID_description>
<Provider_ID>EGUT12 </Provider_ID>
</Row>
</AuxiliaryObject>
<AuxiliaryObject id="2" NAME="Provider_P108">
<Row>
<Index_id>1</Index_id>
<Provider_ID_description>GNRCN</Provider_ID_description>
<Provider_ID>GNRCN</Provider_ID>
</Row>
<Row>
<Index_id>2</Index_id>
<Provider_ID_description>EGUT</Provider_ID_description>
<Provider_ID>EGUT </Provider_ID>
</Row>
</AuxiliaryObject>
</AuxiliaryType>'
)
COLUMNS
name VARCHAR2(30) PATH '@NAME',
id VARCHAR2(10) PATH '@id',
xrows XMLTYPE PATH 'Row') xobjects,
XMLTABLE(
'/Row'
PASSING xobjects.xrows
COLUMNS
index_id VARCHAR2(10) PATH 'Index_id',
provider_id_description VARCHAR2(30) PATH 'Provider_ID_description',
provider_id VARCHAR2(30) PATH 'Provider_ID') xrows;
XMLTable xobjects
chứa mỗi AuxiliaryObject
các phiên bản trong AuxiliaryType
, từ văn bản XML ban đầu của bạn. Nó có các thuộc tính name
và id
, cộng với một XMLType con chứa các hàng lồng nhau. XMLTable thứ hai, xrows
, mở rộng để các phần tử có thể được trích xuất. Việc kết hợp và chuyển các kiểu XML tạo ra hệ thống phân cấp cung cấp kết quả đầu ra bạn muốn:
ID NAME INDEX_ID PROVIDER_ID_DESCRIPTION PROVIDER_ID
---------- ------------------------------ ---------- ------------------------------ ------------------------------
1 Provider_P107 1 GNRCN GNRCN
1 Provider_P107 2 EGUT12 EGUT12
2 Provider_P108 1 GNRCN GNRCN
2 Provider_P108 2 EGUT EGUT
Điều này hoạt động trong SQL Developer dựa trên cơ sở dữ liệu 11.2.0.3 và trong SQL Fiddle .
Phiên bản dựa trên CTE trước đó của câu trả lời này cũng hoạt động trong SQL Developer nhưng SQL Fiddle gặp lỗi ORA-600; cùng với vấn đề bạn gặp phải trong câu hỏi cho thấy có thể SQL Fiddle đang ở trên phiên bản 11gR2 chưa được vá hoặc ít nhất đã được vá khác, có lỗi trong xử lý XML.