Создать таблицу Oracle на основе файла XML

Я пытаюсь создать таблицу оракула, разделенную столбцами, с файлом xml. Я использовал команду sql для создания таблицы:

create table  mytable of XMLType;

insert into mytable2 values(XMLType(bfilename('XMLDIR','XMLFileName.xml'),nls_charset_id('AL32UTF8')));

Файл вставляется в таблицу с xml структурой, но мне нужно просмотреть в столбцах или выделить только поле в тег после токена ct:iid. Например, в первом теге мне нужно выбрать значение «OrphanedBSCs».

    <?xml version="1.0" encoding="WINDOWS-1252"?>
<ArrayOfRootEntityType xmlns:umts="http://www.aircominternational.com/Schemas/UMTS/2010/07" xmlns:tra70="http://www.aircominternational.com/Schemas/Connect/2010/08" xmlns:ct="http://www.aircominternational.com/Schemas/CommonTypes/2009/05" xmlns:co="http://www.aircominternational.com/Schemas/Common/2009/07" xmlns:gsm80="http://www.aircominternational.com/Schemas/GSM/2011/04" xmlns:ecs="http://www.aircominternational.com/Schemas/EWS/ECSCoverageTypes/2011/08" xmlns:gsm70="http://www.aircominternational.com/Schemas/GSM/2010/08" xmlns:config="http://www.aircominternational.com/Schemas/Configuration/2010/08" xmlns:cdma="http://www.aircominternational.com/Schemas/CDMA/2010/12" xmlns:co70="http://www.aircominternational.com/Schemas/Common/2010/08" xmlns:umts80="http://www.aircominternational.com/Schemas/UMTS/2011/04" xmlns:eqp70="http://www.aircominternational.com/Schemas/Equipment/2010/08" xmlns:co80="http://www.aircominternational.com/Schemas/Common/2011/04" xmlns:util="http://www.aircominternational.com/contract/Util/2009/10" xmlns:tra80="http://www.aircominternational.com/Schemas/Connect/2011/04" xmlns:umts70="http://www.aircominternational.com/Schemas/UMTS/2010/08" xmlns:eqp80="http://www.aircominternational.com/Schemas/Equipment/2011/04" xmlns:tra="http://www.aircominternational.com/Schemas/Connect/2009/09" xmlns:lte="http://www.aircominternational.com/Schemas/LTE/2010/08" xmlns:eds="http://www.aircominternational.com/contract/EDS/2009/05" xmlns:umts2="http://www.aircominternational.com/Schemas/UMTS/2009/05" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:eqp="http://www.aircominternational.com/Schemas/Equipment/2009/09" xmlns:gsm="http://www.aircominternational.com/Schemas/GSM/2009/09" xmlns:lte80="http://www.aircominternational.com/Schemas/LTE/2011/04">
  <RootEntityType xsi:type="gsm:MSCType" ct:iid="OrphanedBSCs" ct:bvid="IVLP_201303" ct:eid="223127">
    <Security>
      <CreateDate>2013-03-21T10:01:18</CreateDate>
      <ModifyDate>2013-03-21T10:01:19</ModifyDate>
      <CreateUser>EDS_SOA_Client</CreateUser>
      <ModifyUser>EDS_SOA_Client</ModifyUser>
      <UserGroup>All</UserGroup>
      <Permissions>
        <Owner>write</Owner>
        <Group>write</Group>
        <All>read</All>
      </Permissions>
    </Security>
    <CustomFields>
      <Field Group="SOURCE" Value="NETWORK"/>
      <Field Group="LastUpdated" Value="3/21/2013 10:01:18 AM"/>
    </CustomFields>
    <Location ct:iid="OrphanedBSCs_msc_loc" ct:eid="119692"/>
    <gsm:BSCs>
      <gsm:BSC ct:iid="OrphanedSites" ct:bvid="IVLP_201303" ct:eid="223128">
        <Security>
          <CreateDate>2013-03-21T10:01:19</CreateDate>
          <ModifyDate>2013-03-21T10:01:19</ModifyDate>
          <CreateUser>EDS_SOA_Client</CreateUser>
          <ModifyUser>EDS_SOA_Client</ModifyUser>
          <UserGroup>All</UserGroup>
          <Permissions>
            <Owner>write</Owner>
            <Group>write</Group>
            <All>read</All>
          </Permissions>
        </Security>
        <CustomFields>
          <Field Group="SOURCE" Value="NETWORK"/>
          <Field Group="LastUpdated" Value="3/21/2013 10:01:19 AM"/>
        </CustomFields>
        <Location ct:iid="OrphanedSites_bsc_loc" ct:eid="119693"/>
        <gsm:Parent ct:iid="OrphanedBSCs" ct:eid="223127"/>
        <gsm:BSCId>0</gsm:BSCId>
        <gsm:AllowedOperations>ReadWrite</gsm:AllowedOperations>
      </gsm:BSC>
    </gsm:BSCs>
    <gsm:AllowedOperations>ReadWrite</gsm:AllowedOperations>
  </RootEntityType>
  <RootEntityType xsi:type="gsm:MSCType" ct:iid="HUAWEI_2G_MSC" ct:bvid="IVLP_201303" ct:eid="223131">
    <Security>
      <CreateDate>2013-03-21T10:01:21</CreateDate>
      <ModifyDate>2013-03-21T10:01:21</ModifyDate>
      <CreateUser>EDS_SOA_Client</CreateUser>
      <ModifyUser>EDS_SOA_Client</ModifyUser>
      <UserGroup>All</UserGroup>
      <Permissions>
        <Owner>write</Owner>
        <Group>write</Group>
        <All>read</All>
      </Permissions>
    </Security>
    <CustomFields>
      <Field Group="SOURCE" Value="NETWORK"/>
      <Field Group="LastUpdated" Value="3/21/2013 10:01:21 AM"/>
    </CustomFields>
    <Location ct:iid="HUAWEI_2G_MSC_msc_loc" ct:eid="119696"/>
    <gsm:BSCs>
      <gsm:BSC ct:iid="BSCMG35" ct:bvid="IVLP_201303" ct:eid="223252">
        <Security>
          <CreateDate>2013-03-21T10:01:30</CreateDate>
          <ModifyDate>2013-03-21T10:01:30</ModifyDate>
          <CreateUser>EDS_SOA_Client</CreateUser>
          <ModifyUser>EDS_SOA_Client</ModifyUser>
          <UserGroup>All</UserGroup>
          <Permissions>
            <Owner>write</Owner>
            <Group>write</Group>
            <All>read</All>
          </Permissions>
        </Security>
        <CustomFields>
          <Field Group="SOURCE" Value="NETWORK"/>
          <Field Group="LastUpdated" Value="3/21/2013 10:01:22 AM"/>
        </CustomFields>
        <Location ct:iid="BSCMG35_bsc_loc" ct:eid="119817"/>
        <gsm:Parent ct:iid="HUAWEI_2G_MSC" ct:eid="223131"/>
        <gsm:BSCId>0</gsm:BSCId>
        <gsm:AllowedOperations>ReadWrite</gsm:AllowedOperations>
      </gsm:BSC>
      <gsm:BSC ct:iid="BSCMG34" ct:bvid="IVLP_201303" ct:eid="223270">
        <Security>
          <CreateDate>2013-03-21T10:01:30</CreateDate>
          <ModifyDate>2013-03-21T10:01:30</ModifyDate>
          <CreateUser>EDS_SOA_Client</CreateUser>
          <ModifyUser>EDS_SOA_Client</ModifyUser>
          <UserGroup>All</UserGroup>
          <Permissions>
            <Owner>write</Owner>
            <Group>write</Group>
            <All>read</All>
          </Permissions>
        </Security>
        <CustomFields>
          <Field Group="SOURCE" Value="NETWORK"/>
          <Field Group="LastUpdated" Value="3/21/2013 10:01:22 AM"/>
        </CustomFields>
        <Location ct:iid="BSCMG34_bsc_loc" ct:eid="119835"/>
        <gsm:Parent ct:iid="HUAWEI_2G_MSC" ct:eid="223131"/>
        <gsm:BSCId>0</gsm:BSCId>
        <gsm:AllowedOperations>ReadWrite</gsm:AllowedOperations>
      </gsm:BSC>
    </gsm:BSCs>
    <gsm:AllowedOperations>ReadWrite</gsm:AllowedOperations>
  </RootEntityType>
</ArrayOfRootEntityType>

person user3169822    schedule 07.01.2014    source источник
comment
Есть несколько способов добиться этого. Вы можете создать представление данных XML или создать таблицу с нужными вам столбцами и выполнить вставку/выбор только с необходимыми элементами. Я бы посоветовал вам прочитать документацию Oracle Docs, так как она довольно хороша — docs.oracle.com/cd/E11882_01/appdev.112/e16659/toc.htm   -  person OldProgrammer    schedule 07.01.2014


Ответы (2)


Используйте что-то вроде этого:

select *
from   table-with-xml-column t
,      xmltable
       ( 'PATH/TO/WHAT/YOU/NEED' 
         passing t.xml_column_name
         columns column1 number       path 'path1'
         columns column2 char(1 byte) path 'path2'
         columns column3 varchar2(30) path 'path3'
       ) t2

Совет! Обратите внимание, что обработка столбцов XML может быть мучительно медленной, Oracle часто анализирует содержимое xmltype. Не вводите сложные соединения между XML и реляционными данными или часто выполняемыми операторами, не проверив производительность с реалистичным размером содержимого XML.

person Guido Leenders    schedule 08.01.2014
comment
Привет, спасибо за вашу помощь, этот пример очень полезен, но в некоторых тегах я не могу его использовать. Например, в этом теге ‹gsm:BSCs› ‹gsm:BSC ct:iid=BSCMG35 ct:bvid=IVLP_201303 ct:eid=223252› я не могу получить значение BSCMG35 сообщение об ошибке ORA-19228:XPST0008 - необъявленный идентификатор: отображался префикс 'gsm' локального имени 'gsm:BSCs'. Я использую запрос: SELECT ab.* FROM MSC_XML p, XMLTable('/ArrayOfRootEntityType/RootEntityType/gsm:BSCs/gsm:BSC' PASSING p.OBJECT_VALUE COLUMNS MSC VARCHAR2(38) PATH '@*:iid') ab; - person user3169822; 08.01.2014
comment
Ах хорошо. Не забудьте проверить использование пространства имен. Без него либо ошибка, либо нет доступа :-). Например, так: выберите extractValue(l_xml, '/ipinfo/ip_address', g_ns) - person Guido Leenders; 08.01.2014

Спасибо за помощь. Я решил свою проблему, установив пространства имен, используемые в файле xml. Это новый запрос для выбора любых данных в xml:

select * from table-with-xml-column t , xmltable ( (XMLNAMESPACES('url_indicated_in_xmlfile_about_ct' as "ct"), 'ПУТЬ/К/ЧТО/ВАМ/НУЖНО', передавая t.xml_column_name столбцы столбец1 номер путь 'путь1' столбцы столбец2 char(1 byte) path 'path2' columns column3 varchar2(30) path 'path3' ) t2

person user3169822    schedule 09.01.2014
comment
Хорошо, приятно слышать, что вам помогли. Я думаю, что хорошее место для этого добавления - поместить его в сам вопрос с помощью «редактировать». Рецензенты могли бы переместить его туда. - person Guido Leenders; 09.01.2014