Импорт данных 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 ссылками на него.