Oracle XMLTable/XMLTYPE (не знаю)

Я пытаюсь создать базу данных с помощью OracleXE11, и я пытаюсь создать XML-таблицы и вводить в них данные.

Шаг 1:

CREATE TABLE Customer(
  customerId int Primary KEY,
  signUpDate Date NOT NULL,
  CustomerData XMLTYPE,
  CustomerAdress XMLTYPE);

Шаг 2:

CustomerData.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 строку (я знаю, почему... потому что при создании только 1 строки с использованием всех XML-файлов, которые я объявил)

Я подумал... может быть, ПРОЦЕДУРА (PL/SQL) поможет мне с этим

И другие проблемы (мне нужно использовать их все для обновления/вставки/удаления): - Xpath - DOM - SAX - Xquery - создание XML-схемы для проверки введенного XML-файла - запись XML-файла из БД в файл.xml на рабочем столе - чтение XML-файл.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>

. . .

РЯД №:

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-запроса)


person MatuRco    schedule 04.01.2015    source источник
comment
Если вы вставляете одну строку в таблицу, вы получаете одну строку обратно при выборе. Что именно вы ожидаете? Пожалуйста, объясните, что вы пытаетесь выделить. Ваш другой вопрос слишком широк.   -  person OldProgrammer    schedule 04.01.2015


Ответы (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;
person parikLS    schedule 06.01.2015