Как проанализировать простой фрагмент XML в Oracle PL / SQL и загрузить его в глобальную временную таблицу? - PullRequest
6 голосов
/ 05 февраля 2010

В SQL Server легко проанализировать переменную vachar, которая содержит простой фрагмент XML, созданный с атрибутами, и загрузить его во временную таблицу - см. Пример ниже:

declare @UpdateXML VARCHAR(8000)

set @UpdateXML='<ArrayOfRecords>
  <Record Field01="130" Field02="1700" Field03="C" />
  <Record Field01="131" Field02="1701" Field03="C" />
  <Record Field01="132" Field02="1702" Field03="C" />
 </ArrayOfRecords>'

DECLARE @hdoc int

EXEC sp_xml_preparedocument @hdoc OUTPUT, @UpdateXML

INSERT 
INTO #tblTemp( 
  [Field01],
  [Field02],
  [Field03]
 )
SELECT * 
FROM OPENXML(@hdoc, '//ArrayOfRecords/Record') 
WITH ( Field01 int,
  Field02 int,
  Field03 char(1)
 )

EXEC sp_xml_removedocument @hdoc

Есть ли простой пример, эквивалентный этому в Oracle PL / SQL?

В Oracle есть пакет DBMS_XMLSTORE, но ему нужен фрагмент XML в определенном каноническом формате с использованием элементов ROWSET и ROW. DBMS_XMLSTORE не работает с атрибутами XML.

Кроме того, я не уверен на 100%, нужно ли мне создать XSD из моего фрагмента XML и зарегистрировать его в базе данных Oracle, прежде чем я смогу использовать другие инструменты / запросы PL / SQL XML.

Спасибо!

1 Ответ

8 голосов
/ 05 февраля 2010

Реализация Oracle DB DB имеет откровенно изумительное количество вариантов, и не всегда ясно (по крайней мере, мне), какой из них применяется в любом конкретном сценарии.В данном конкретном случае вам нужна XMLTable () , которая превращает XQuery в набор строк.

Сначала мы создаем таблицу.

SQL> create table t23
  2      (field01 number
  3       , field02 number
  4       , field03 char(1)
  5       )
  6  /

Table created.

SQL>

Затем мы заполняем его ...

SQL> declare
  2      x varchar2(2000) := '<ArrayOfRecords>
  3                        <Record Field01="130" Field02="1700" Field03="C" />
  4                        <Record Field01="131" Field02="1701" Field03="C" />
  5                        <Record Field01="132" Field02="1702" Field03="C" />
  6                   </ArrayOfRecords>';
  7  begin
  8      insert into t23
  9      select *
 10      from xmltable
 11          ( '/ArrayOfRecords/Record'
 12             passing xmltype (x)
 13             columns f1 number path '@Field01'
 14                     , f2 number path '@Field02'
 15                     , f3 char(1) path '@Field03'
 16          )
 17      ;
 18  end;
 19  /

PL/SQL procedure successfully completed.

SQL>

Наконец мы доказываем, что это сработало ....

SQL> select * from t23
  2  /

   FIELD01    FIELD02 F
---------- ---------- -
       130       1700 C
       131       1701 C
       132       1702 C

SQL>
...