2015-04-20 3 views
1

Мы должны прочитать xml, используя pl/sql. Верхние несколько строк xml вставляются ниже. В xml для одного узла есть одно Оборудование. Для одного Оборудования есть несколько шкафов. Для одного Кабинета есть несколько Subrack & для одного Subrack есть несколько плат.Чтение xml с использованием Oracle

Мы проанализировали ниже запрос.

Шаг-1:

create table emp_xml of xmltype xmltype store as securefile binary xml; 

Шаг 2:

insert into emp_xml values (xmltype(bfilename('XML_DIR','ahm_2015_04_01_172428.xml'), nls_charset_id('AL32UTF8'))); 

Шаг 3:

select * from emp_xml; 

Шаг 4:

select x.* 
    from emp_xml t, 
     xmltable(xmlnamespaces(default  'http://www.ericsson.com/axe/export/hw'(http ://
                      www.ericsson.com/axe/
                      export/
                      hw%27)), 
      '/NetworkInventory/Node' passing t.object_value columns 
      SiteName varchar2(10) path '@Name', 
      SiteType varchar2(10) path '@Type', 
      BuildingPractice varchar2(10) path 
      '//Equipment/@BuildingPractice') x; 

Этот запрос работает отлично. Но когда я пытаюсь получить детали Кабинета или Subrack, мы становимся ниже ошибки.

ORA-19279: XPTY0004 - XQuery dynamic type mismatch: expected singleton sequence - got  multi-item sequence 
ORA-06512: at line 33 
19279. 00000 - "XQuery dynamic type mismatch: expected singleton sequence - got multi- item sequence" 
*Cause: The XQuery sequence passed in had more than one item. 
*Action: Correct the XQuery expression to return a single item sequence. 

Ниже приводится несколько строк XML.

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<NetworkInventory xmlns="http://www.ericsson.com/axe/export/hw" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ericsson.com/axe/export/hw file:/opt/ericsson/nms_smo_srv/etc/export.xsd"> 
    <Description>AXE HARDWARE INVENTORY DATA</Description> 
    <ExportDateTime Date="2015-04-01" Time="17:24:28"/> 
    <Node AdjustDate="2015-03-21" FunctionType=" " Name="BSC20" Site=" " Type="AXE" UserLabel=""> 
     <Equipment BuildingPractice="BYB501"> 
      <Cabinet Position="CabNumber=1"> 
       <Subrack Name="FAN-1" Position="X=3,Y=2" Type="CP"> 
        <Board Name=" " SlotPosition="255" Type="CP"> 
         <ProductData FirstOperationDate="2013-11-20" LastChangedDate="2013-11-20" ManufacturedDate=" " ProductName=" " ProductNumber=" " ProductRevision=" " SerialNumber=" " Supplier="Ericsson AB"/> 
        </Board> 
        <Board Name=" " SlotPosition="255" Type="CP"> 
         <ProductData FirstOperationDate="2013-11-20" LastChangedDate="2013-11-20" ManufacturedDate=" " ProductName=" " ProductNumber=" " ProductRevision=" " SerialNumber=" " Supplier="Ericsson AB"/> 
        </Board> 
       </Subrack> 

ответ

0

Потому что ваш кабинет установлен не на одну итерацию.
Если вы хотите представить повторяющиеся группы в реляционном формате, вам нужно извлечь последовательность элементов в основном выражении XQuery.
Каждый элемент затем передается в предложение COLUMNS для дальнейшего измельчения в столбцы.

0

Вы пытаетесь расширить конструкцию, похожую на вложенные таблицы. Ваш узел Оборудование может иметь несколько шкафы, поэтому для извлечения деталей из тех, что вам нужно пройти те на второй XMLTable:

select x.SiteName, x.SiteType, x.BuildingPractice, y.Position 
from emp_xml t 
cross join xmltable(
    xmlnamespaces(default 'http://www.ericsson.com/axe/export/hw'), 
    '/NetworkInventory/Node' passing t.object_value columns 
     SiteName varchar2(10) path '@Name', 
     SiteType varchar2(10) path '@Type', 
     BuildingPractice varchar2(10) path 'Equipment/@BuildingPractice', 
     Equipment XMLType path 'Equipment' 
) x 
cross join xmltable(
    xmlnamespaces(default 'http://www.ericsson.com/axe/export/hw'), 
    '//Cabinet' passing x.Equipment columns 
     Position varchar2(15) path '@Position' 
) y; 

SITENAME SITETYPE BUILDINGPRACTICE POSITION  
---------- ---------- ---------------- --------------- 
BSC20  AXE  BYB501   CabNumber=1  

Чтобы получить данные Блочный каркас тоже, вам нужно пройти, что из одной трети уровень XMLTable и т. д.

Смежные вопросы