第1步:
CREATE TABLE Customer(
idCustomer INT PRIMARY KEY,
XmlCustomer XMLTYPE not null);
第2步:
CREATE OR REPLACE DIRECTORY XMLDIR AS 'C:\xml_files';
第3步:
XmlCustomer.xml
<?xml version="1.0"?>
<XmlCustomer>
<Customer>
<name>Sally Black</name>
<type>Person</type>
<nip>1234567890</nip>
<city>London</city>
<street>Blue Street 2</street>
<signUpDate>21-12-2007</signUpDate>
</Customer>
<Customer>
<name>John Snow</name>
<type>Person</type>
<nip>2345678901</nip>
<city>Wroclaw</city>
<street>Uprised 23</street>
<signUpDate>12-02-1991</signUpDate>
</Customer>
<Customer>
<name>PC-Kom</name>
<type>Fleet</type>
<nip>3456789012</nip>
<city>Swidnica</city>
<street>Water Street 5</street>
<signUpDate>12-02-1991</signUpDate>
</Customer>
</XmlClient>
第4步:
现在我试图将这些XML数据输入到表客户
中INSERT INTO Customer (idCustomer,XmlCustomer) VALUES (1, XMLType(bfilename('XMLDIR', 'XmlCustomer.xml'), nls_charset_id('AL32UTF8')));
但我将所有文件插入1行。 我的问题是如何插入这些数据来接收3个ROW(xml文件包含3行) 以及如何自动递增idCustomer ??
此外,我需要创建这个xml文件的xsd:schema,这对我来说有点黑魔法^^。
我是Oracle DB和XML的新手,所以即时通讯等待直接回答。
答案 0 :(得分:1)
您可以使用XQuery
,更具体地说是XMLTable
,将XML文档转换为可以视为行的多个值:
INSERT INTO Customer (idCustomer, xmlCustomer)
SELECT CustomerIdSeq.nextval, XmlCustomer
FROM XMLTable('/XmlCustomer/Customer'
PASSING XMLType(bfilename('XMLDIR', 'XmlCustomer.xml'), nls_charset_id('AL32UTF8'))
COLUMNS "XMLCUSTOMER" XMLType PATH '/'
);
我已创建a sequence,我正在调用nextval
来生成“自动增量”客户ID; Oracle 12c具有自动递增列,但在早期版本中,您需要一个序列来伪造它,可选地使用触发器来隐藏它。无论如何,这给了:
SELECT * FROM Customer ORDER BY idCustomer;
IDCUSTOMER XMLCUSTOMER
---------- ---------------------------------------------------
1 <Customer>
<name>Sally Black</name>
<type>Person</type>
<nip>1234567890</nip>
<city>London</city>
<street>Blue Street 2</street>
<signUpDate>21-12-2007</signUpDate>
</Customer>
2 <Customer>
<name>John Snow</name>
<type>Person</type>
<nip>2345678901</nip>
<city>Wroclaw</city>
<street>Uprised 23</street>
<signUpDate>12-02-1991</signUpDate>
</Customer>
3 <Customer>
<name>PC-Kom</name>
<type>Fleet</type>
<nip>3456789012</nip>
<city>Swidnica</city>
<street>Water Street 5</street>
<signUpDate>12-02-1991</signUpDate>
</Customer>
SQL Fiddle很乐意创建populate,但很难将其作为简单的XML查询...
除非您特别想要存储XML构造,否则最好创建单独的列并将数据加载到这些列中:
SELECT CustomerIdSeq.nextval, name, type, nip, city, street, signUpDate
FROM XMLTable('/XmlCustomer/Customer'
PASSING XMLType(bfilename('D42', 'XmlCustomer.xml'), nls_charset_id('AL32UTF8'))
COLUMNS "NAME" VARCHAR2(20) PATH 'name',
"TYPE" VARCHAR2(10) PATH 'type'
"NIP" NUMBER PATH 'nip'
"CITY" VARCHAR2(20) PATH 'city'
"STREET" VARCHAR2(20) PATH 'street'
"SIGNUPDATE" DATE PATH 'signUpDate'
);
然后:
INSERT INTO Customer (idCustomer, name, type, nip, city, street, signUpDate)
SELECT CustomerIdSeq.nextval, name, type, nip, city, street,
TO_DATE(signUpDate, 'DD-MM-YYYY')
FROM XMLTable('/XmlCustomer/Customer'
PASSING XMLType(bfilename('D42', 'XmlCustomer.xml'), nls_charset_id('AL32UTF8'))
COLUMNS "NAME" VARCHAR2(20) PATH 'name',
"TYPE" VARCHAR2(10) PATH 'type',
"NIP" NUMBER PATH 'nip',
"CITY" VARCHAR2(20) PATH 'city',
"STREET" VARCHAR2(20) PATH 'street',
"SIGNUPDATE" VARCHAR2(10) PATH 'signUpDate'
);
给出了:
SELECT * FROM Customer ORDER BY idCustomer;
IDCUSTOMER NAME TYPE NIP CITY STREET SIGNUPDATE
---------- -------------------- ---------- ---------- -------------------- -------------------- ----------
4 Sally Black Person 1234567890 London Blue Street 2 21-DEC-07
5 John Snow Person 2345678901 Wroclaw Uprised 23 12-FEB-91
6 PC-Kom Fleet 3456789012 Swidnica Water Street 5 12-FEB-91
当然,您需要为字符串列设置合适的大小。请注意,我已使用to_date()
将日期字符串转换为实际日期;因为它不是标准的YYYY-MM-DD ISO格式XML expects,所以它不能直接作为日期值提取。