XML Row TYPE(xml数据输入)

时间:2015-01-05 00:28:24

标签: xml database oracle xsd xmltype

第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的新手,所以即时通讯等待直接回答。

1 个答案:

答案 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  

SQL Fiddle

当然,您需要为字符串列设置合适的大小。请注意,我已使用to_date()将日期字符串转换为实际日期;因为它不是标准的YYYY-MM-DD ISO格式XML expects,所以它不能直接作为日期值提取。