Импорт данных XML в базу данных Oracle

Я новичок в DBAdministration, и меня попросили спроектировать структуру БД, начиная с больших (8 ГБ) XML-файлов. Я здание строение, и оно почти закончено.

Я тестирую импорт данных из XML в таблицы. Я сохранил содержимое файла в столбце таблицы, но когда я пытаюсь экспортировать одно значение столбца, у меня нет результатов (и ошибок).

Вот код:

CREATE TABLE TESTTABLE2 ( xml_file XMLTYPE ) XMLTYPE xml_file STORE as securefile binary xml;

INSERT INTO TESTTABLE2 (xml_file) 
(SELECT XMLTYPE(bfilename('EXPORT_DUMPS','test001.xml'), nls_charset_id('WE8ISO8859P1')) from dual );


SELECT 'CD_UID'
FROM XMLTABLE('XML/records/REC/UID' passing (SELECT xml_file FROM TESTTABLE2) 
           COLUMNS CD_UID VARCHAR2(4000));           

XML начинается так:

<?xml version="1.0" encoding="UTF-8"?> 

<records xmlns="http://xxxxxxxxxxxxxx">

<REC r_id_disclaimer="yyyyy">
<UID>UID_number</UID>

Я также попытался извлечь все данные непосредственно из файла XML, который я сохранил в папке на сервере Oracle, используя следующий код: он также работает, но без вставленных строк.

INSERT INTO TESTTABLE(CD_UID)
WITH t AS (SELECT xmltype(bfilename('EXPORT_DUMPS','test001.xml'), nls_charset_id('WE8ISO8859P1')) xmlcol FROM dual)
SELECT
extractValue(value(x),'REC/UID') as CD_UID           
FROM t,TABLE(XMLSequence(extract(t.xmlcol,'/records/REC'))) x;

Мне также интересно, влияет ли структура файла XML на процедуру импорта. Я имею в виду: в моей структуре есть код, который ссылается на значение, которое находится в другой таблице, но в XML у меня есть непосредственно имя значения..)

Я также пытался использовать XMLSpy, пытаясь конвертировать и экспортировать в БД, но это не создает никаких связей между таблицами.

Есть ли кто-нибудь, кто может помочь мне найти решение и проехать через него?

Большое спасибо!

1 ответ

Решение

Вы можете использовать предложение XMLTable для получения данных в реляционной форме:

select x.cd_uid
from testtable2 t
cross join xmltable(xmlnamespaces(default 'http://xxxxxxxxxxxxxx'),
  '/records/REC'
  passing t.xml_file 
  columns cd_uid varchar2(20) path 'UID'
) x;

CD_UID             
--------------------
UID_number          

У вас есть пространство имен в records узел, так что вам нужно включить это через xmlnamespaces оговорка; поскольку у вас есть только один, я сделал его по умолчанию, так что вам не нужно загромождать XPath ссылками на него.

Другие вопросы по тегам