Oracle: загрузка большого xml-файла?


12 принят

Вы можете получить доступ к XML-файлам на сервере через SQL. С вашими данными в файле /tmp/tmp.xml вы должны сначала объявить каталог:

SQL> create directory d as '/tmp';

Directory created

Затем вы можете напрямую запросить свой XML-файл:

SQL> SELECT XMLTYPE(bfilename('D', 'tmp.xml'), nls_charset_id('UTF8')) xml_data
  2    FROM dual;

XML_DATA
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<badges>
  [...]

Чтобы получить доступ к полям в вашем файле, вы можете использовать метод, описанный в другом SO, например:

SQL> SELECT UserId, Name, to_timestamp(dt, 'YYYY-MM-DD"T"HH24:MI:SS.FF3') dt
  2    FROM (SELECT XMLTYPE(bfilename('D', 'tmp.xml'), 
                            nls_charset_id('UTF8')) xml_data
  3            FROM dual),
  4         XMLTable('for $i in /badges/row
  5                              return $i'
  6                  passing xml_data
  7                  columns UserId NUMBER path '@UserId',
  8                          Name VARCHAR2(50) path '@Name',
  9                          dt VARCHAR2(25) path '@Date');

    USERID NAME       DT                         
---------- ---------- ---------------------------
      3718 Teacher    2008-09-15 08:55:03.923    
       994 Teacher    2008-09-15 08:55:03.957    

3

Похоже, вы говорите о 2 проблемах - сначала, чтобы получить XML-документ, где Oracle может его увидеть. А потом, возможно, сделать так, чтобы к данным могли применяться стандартные реляционные инструменты.

Во-первых, вы или ваш администратор базы данных можете создать таблицу с столбцом BLOB, CLOB или BFILE и загрузить данные. Если у вас есть доступ к серверу, на котором проживает база данных, вы можете определить объект DIRECTORY в базе данных, который указывает на каталог операционной системы. Тогда поставьте там свой файл. А затем либо настройте его как BFILE, либо прочитайте его. (CLOB и BLOB хранятся в базе данных, BFILE сохраняет указатель на файл со стороны операционной системы).

Кроме того, используйте какой-то инструмент, который позволит вам напрямую писать CLOB-файлы в базу данных. В любом случае, это доводит вас до точки, где вы можете увидеть документ экземпляра XML в базе данных.

Итак, теперь у вас есть документ экземпляра. Шаг 1 завершен.

В зависимости от версии у Oracle есть довольно неплохие инструменты для измельчения XML в реляционные таблицы.

Это может быть довольно декларативным. Хотя это выходит за рамки того, что я на самом деле сделал (у меня есть проект, где я буду пытаться это осенью), вы можете теоретически загрузить вашу XML-схему в базу данных и аннотировать ее с помощью пешеходного перехода между реляционными таблицами и XML. Затем возьмите свой CLOB или BFILE и преобразуйте его в столбец XMLTYPE с определенной схемой, и все готово - измельчение происходит автоматически, все данные есть, все реляционное, все доступно для стандартного SQL без XQUERY или XML расширения.

Конечно, если вы предпочитаете использовать XQUERY, то просто возьмите CLOB или BFILE, конвертируйте его в XMLTYPE и пойдите для него.


0

Я бы сделал просто:

grep '<row' file.xml |
gawk -F '"' '{printf("insert into badges(userid,name,date) values ("%s","%s","%s");
",$2,$4,$6); } > request.sql

или вы можете создать Java-программу с использованием анализатора SAX. Каждый раз, когда ваш обработчик находит новую строку «Элемент», вы получаете атрибуты и вставляете новую запись в свою базу данных.

SQL, XML, оракул,

sql,xml,oracle,

5

Ответов: 3


12 принят

Вы можете получить доступ к XML-файлам на сервере через SQL. С вашими данными в файле /tmp/tmp.xml вы должны сначала объявить каталог:

SQL> create directory d as '/tmp';

Directory created

Затем вы можете напрямую запросить свой XML-файл:

SQL> SELECT XMLTYPE(bfilename('D', 'tmp.xml'), nls_charset_id('UTF8')) xml_data
  2    FROM dual;

XML_DATA
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<badges>
  [...]

Чтобы получить доступ к полям в вашем файле, вы можете использовать метод, описанный в другом SO, например:

SQL> SELECT UserId, Name, to_timestamp(dt, 'YYYY-MM-DD"T"HH24:MI:SS.FF3') dt
  2    FROM (SELECT XMLTYPE(bfilename('D', 'tmp.xml'), 
                            nls_charset_id('UTF8')) xml_data
  3            FROM dual),
  4         XMLTable('for $i in /badges/row
  5                              return $i'
  6                  passing xml_data
  7                  columns UserId NUMBER path '@UserId',
  8                          Name VARCHAR2(50) path '@Name',
  9                          dt VARCHAR2(25) path '@Date');

    USERID NAME       DT                         
---------- ---------- ---------------------------
      3718 Teacher    2008-09-15 08:55:03.923    
       994 Teacher    2008-09-15 08:55:03.957    

3

Похоже, вы говорите о 2 проблемах - сначала, чтобы получить XML-документ, где Oracle может его увидеть. А потом, возможно, сделать так, чтобы к данным могли применяться стандартные реляционные инструменты.

Во-первых, вы или ваш администратор базы данных можете создать таблицу с столбцом BLOB, CLOB или BFILE и загрузить данные. Если у вас есть доступ к серверу, на котором проживает база данных, вы можете определить объект DIRECTORY в базе данных, который указывает на каталог операционной системы. Тогда поставьте там свой файл. А затем либо настройте его как BFILE, либо прочитайте его. (CLOB и BLOB хранятся в базе данных, BFILE сохраняет указатель на файл со стороны операционной системы).

Кроме того, используйте какой-то инструмент, который позволит вам напрямую писать CLOB-файлы в базу данных. В любом случае, это доводит вас до точки, где вы можете увидеть документ экземпляра XML в базе данных.

Итак, теперь у вас есть документ экземпляра. Шаг 1 завершен.

В зависимости от версии у Oracle есть довольно неплохие инструменты для измельчения XML в реляционные таблицы.

Это может быть довольно декларативным. Хотя это выходит за рамки того, что я на самом деле сделал (у меня есть проект, где я буду пытаться это осенью), вы можете теоретически загрузить вашу XML-схему в базу данных и аннотировать ее с помощью пешеходного перехода между реляционными таблицами и XML. Затем возьмите свой CLOB или BFILE и преобразуйте его в столбец XMLTYPE с определенной схемой, и все готово - измельчение происходит автоматически, все данные есть, все реляционное, все доступно для стандартного SQL без XQUERY или XML расширения.

Конечно, если вы предпочитаете использовать XQUERY, то просто возьмите CLOB или BFILE, конвертируйте его в XMLTYPE и пойдите для него.


0

Я бы сделал просто:

grep '<row' file.xml |
gawk -F '"' '{printf("insert into badges(userid,name,date) values ("%s","%s","%s");
",$2,$4,$6); } > request.sql

или вы можете создать Java-программу с использованием анализатора SAX. Каждый раз, когда ваш обработчик находит новую строку «Элемент», вы получаете атрибуты и вставляете новую запись в свою базу данных.

SQL, XML, оракул,
Похожие вопросы