正在 Oracle 数据库中导入 XML 数据
importing XML data in Oracle DB
我是 DBAdministration 的新手,有人要求我从大 (8Gb) xml 文件开始设计数据库结构。
我正在搭建结构,快完成了。
我正在测试将数据从 XML 导入到 table 中。
我已将文件的内容存储到 table 中的一列中,但是当我尝试导出一列值时,我没有结果(也没有错误)。
这里是代码:
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 文件的结构是否对导入过程有任何影响。我的意思是:在我的结构中,我有一个代码引用另一个 table 中的值,但在 XML 中我直接有值名称..)
我也尝试过使用 XMLSpy 尝试转换并导出到数据库,但它不会在 table 之间创建任何关系。
有没有人可以帮助我找到解决方案并顺利通过?
非常感谢!
您可以使用an XMLTable clause以关系形式获取数据:
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。
我是 DBAdministration 的新手,有人要求我从大 (8Gb) xml 文件开始设计数据库结构。 我正在搭建结构,快完成了。
我正在测试将数据从 XML 导入到 table 中。 我已将文件的内容存储到 table 中的一列中,但是当我尝试导出一列值时,我没有结果(也没有错误)。
这里是代码:
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 文件的结构是否对导入过程有任何影响。我的意思是:在我的结构中,我有一个代码引用另一个 table 中的值,但在 XML 中我直接有值名称..)
我也尝试过使用 XMLSpy 尝试转换并导出到数据库,但它不会在 table 之间创建任何关系。
有没有人可以帮助我找到解决方案并顺利通过?
非常感谢!
您可以使用an XMLTable clause以关系形式获取数据:
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。