Oracle XMLTable / XMLTYPE(不知道)
Posted
技术标签:
【中文标题】Oracle XMLTable / XMLTYPE(不知道)【英文标题】:Oracle XMLTable / XMLTYPE (no idea) 【发布时间】:2015-01-04 15:47:10 【问题描述】:我正在尝试使用 OracleXE11 创建数据库,我想做的是创建 XML 表并将数据输入其中。
第 1 步:
CREATE TABLE Customer(
customerId int Primary KEY,
signUpDate Date NOT NULL,
CustomerData XMLTYPE,
CustomerAdress XMLTYPE);
第 2 步:
客户数据.xml
<?xml version="1.0"?>
<CustomerData>
<Customer>
<name>Alex Smith</name>
<type>Fleet</type>
<nip>1234567890</nip>
</Customer>
<Customer>
<name>Saly North</name>
<type>person</type>
<nip>2345678901</nip>
</Customer>
<CustomerData>
客户地址.xml
<?xml version="1.0"?>
<CustomerAdress>
<Adress>
<city>Xxxx</city>
<street>Yyyy 2</Street>
<postcode>56-200</postcode>
</Adress>
<Adress>
<city>Zzzz</city>
<Street>Uuuu 5</street>
<postcode>57-300</postcode>
</Adress>
<CustomerAdress>
第 3 步:
CREATE OR REPLACE DIRECTORY XMLDIR AS 'C:\xml_files';
第 4 步: 现在我有一个问题,因为我不知道如何输入这些数据。 我尝试过:
INSERT INTO Customer (customerId, signUpDate, CustomerData, CustomerAdress) VALUES
(1, to_date('12-05-1970','dd-mm-yyyy'), XMLType(bfilename('XMLDIR', 'CustomerData.xml'), nls_charset_id('AL32UTF8')), XMLType(bfilename('XMLDIR', 'CustomerAdress.xml'), nls_charset_id('AL32UTF8')));
但它返回我 1 行(我知道为什么......因为使用我声明的所有 xml 文件只创建 1 行)
我想知道...也许 PROCEDURE (PL/SQL) 可以帮助我完成它
另一个问题是(我需要将它们全部用于更新/插入/删除): - Xpath - DOM - 萨克斯 - Xquery - 创建 XML 模式以验证输入的 XML 文件 - 将 XML 文件从 DB 写入桌面上的 file.xml - 从桌面读取 XML file.xml 到数据库
我什至不确定我是否开始使用它。 //------------------------------------------------ ------------// 我试图将 xmlfile 插入表中,但我不知道如何将数据从 xmlfile 中分离出来
我期待什么
第 1 行:
customerId = 1 ||
signUpDate = 12-05-1970 ||
CustomerData = <name>Alex Smith</name> <type>Fleet</type> <nip>1234567890</nip> ||
CustomerAdress = <city>Xxxx</city> <street>Yyyy 2</Street> <postcode>56-200</postcode>
第 2 行:
customerId = 2 ||
signUpDate = 26-10-2007 ||
CustomerData = <name>Saly North</name> <type>Person</type> <nip>2345678901</nip> ||
CustomerAdress = <city>Zzzz</city> <street>Uuuu 5</Street> <postcode>57-300</postcode>
。 . .
第 n 行:
customerId = n ||
signUpDate = dd-mm-yyy ||
CustomerData = <name>Xxx Yyy</name> <type>Xxx</type> <nip>nnnnnnnnnn</nip> ||
CustomerAdress = <city>Xxx</city> <street>Xxx</Street> <postcode>xx-xxx</postcode>
在我看来这就是 XMLTYPE 表的样子,但我可能错了(我还需要使用简单的操作来操作这个 XMLDB,比如使用 sql 查询的插入/删除/更新)
【问题讨论】:
如果您在表格中插入一行,您会在选择时返回一行。你到底在期待什么?请解释您要选择的内容。你的另一个问题太宽泛了。 【参考方案1】:我认为您正在寻找 XMLTable 函数,它非常有用,如果您需要解析 xml 文件。 您可以将 xml 加载到另一个表中,例如 customer_xml,然后使用 XMLTable 函数解析 xml 数据并插入主表 customer。例如:
CREATE TABLE CUSTOMER (customerid NUMBER,
signupdate DATE,
name VARCHAR2(255),
type VARCHAR2(255),
nip VARCHAR2(255))
/
CREATE TABLE CUSTOMER_XML (dataxml XMLTYPE)
/
CREATE SEQUENCE seq_customer_id START WITH 1 INCREMENT BY 1
/
CREATE PROCEDURE p_customer_insert
IS
TYPE t_customer_aat IS TABLE OF customer%ROWTYPE INDEX BY PLS_INTEGER;
l_customer_aat t_customer_aat;
l_dataxml XMLTYPE;
BEGIN
SELECT dataxml INTO l_dataxml
FROM customer_xml;
SELECT seq_customer_id.NEXTVAL, sysdate, x.*
BULK COLLECT INTO l_customer_aat
FROM XMLTABLE('/CustomerData/Customer' PASSING l_dataxml
COLUMNS
name VARCHAR2(255) PATH 'name',
type VARCHAR2(255) PATH 'type',
nip VARCHAR2(255) PATH 'nip') x;
FORALL indx in 1..l_customer_aat.COUNT
INSERT INTO customer VALUES l_customer_aat(indx);
COMMIT;
END;
【讨论】:
以上是关于Oracle XMLTable / XMLTYPE(不知道)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 oracle XMLTYPE XMLTABLE 中支持 1 级路径目录