Oracle: загрузка большого XML-файла? - PullRequest
5 голосов
/ 15 июня 2009

Итак, теперь у меня есть большой объем XML-данных, которые меня интересуют:

http://blog.stackoverflow.com/2009/06/stack-overflow-creative-commons-data-dump

Я бы хотел загрузить это в Oracle для игры.

Как я могу напрямую загрузить большой файл XML непосредственно в Oracle? Решения на стороне сервера (где файл данных может быть открыт на сервере) и решения на стороне клиента приветствуются.

Вот немного badges.xml для конкретного примера.

<?xml version="1.0" encoding="UTF-8" ?>
  <badges>
  <row UserId="3718" Name="Teacher" Date="2008-09-15T08:55:03.923"/>
  <row UserId="994" Name="Teacher" Date="2008-09-15T08:55:03.957"/>
  ...

Ответы [ 3 ]

12 голосов
/ 16 июня 2009

Вы можете получить доступ к 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 голосов
/ 16 июня 2009

Похоже, вы говорите о двух проблемах - во-первых, о том, как получить документ 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 голосов
/ 16 июня 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...