2013-04-02 2 views
0

Мне нужно создать таблицу, заполненную из XML-файла (хранящегося в формате BLOB) с использованием SQL-запроса (Oracle 11g R2). Таблица должна содержать одну строку для каждого учащегося.Как создать таблицу из файла XML, хранящегося в формате BLOB?

Когда я пытаюсь использовать следующий синтаксис:

select x.* 
from XMLTABLE('/XML/highschool/class/student' passing (SELECT XML_CONTENT 
    FROM T_FILES 
    WHERE ID_FILE = 1) 
    columns seq for ordinality, 
    STUDENT_NAME Varchar2(500) PATH 'cd[@name=''STUDENT_NAME'']@data' 
) 
as x; 

Я получаю ошибку

19109. 00000 - "RETURNING keyword expected" 
*Cause: The keyword RETURNING was missing. 
*Action: Specify the RETURNING keyword. 

Я пытался использовать dbms_xmlgen.getxmltype и некоторые другие решения без успеха.

ответ

1

Ваш XPATH поврежден.

использование:

PATH 'cd[@name="STUDENT_NAME"]/@data' 

например:

SQL> create table T_FILES 
    2 (XML_CONTENT xmltype, ID_FILE number); 

Table created. 

SQL> insert into t_files values (
    2 xmltype('<XML> 
    3 <highschool> 
    4  <class> 
    5  <user> 
    6   <cd name="STUDENT_NAME" data="foo"/> 
    7  </user> 
    8  <user> 
    9   <cd name="STUDENT_NAME" data="foo2"/> 
10  </user> 
11  </class> 
12 </highschool> 
13 </XML>'), 1); 

1 row created. 

SQL> commit; 

Commit complete. 

SQL> select /*+ cursor_sharing_exact */ a.* 
2 from XMLTABLE('/XML/highschool/class/user' PASSING (SELECT XML_CONTENT 
3  FROM T_FILES 
4  WHERE ID_FILE = 1) 
5    columns 
6    seq for ordinality, 
7    STUDENT_NAME Varchar2(500) PATH 'cd[@name="STUDENT_NAME"]/@data' 
8  ) a; 

     SEQ STUDENT_NAME 
--------- -------------------- 
     1 foo 
     2 foo2 

против

SQL> select /*+ cursor_sharing_exact */ a.* 
    2 from XMLTABLE('/XML/highschool/class/user' PASSING (SELECT XML_CONTENT 
    3  FROM T_FILES 
    4  WHERE ID_FILE = 1) 
    5    columns 
    6    seq for ordinality, 
    7    STUDENT_NAME Varchar2(500) PATH 'cd[@name=''STUDENT_NAME'']@data' 
    8  ) a; 
from XMLTABLE('/XML/highschool/class/user' PASSING (SELECT XML_CONTENT 

хотя синтаксис вы используете только справедливо, если есть одна строка в базовой таблице это ID_FILE. Если это не так, то вы должны поместить таблицу вне xmltable определения как:

select /*+ cursor_sharing_exact */ a.* 
from T_FILES t, 
    XMLTABLE('/XML/highschool/class/user' PASSING t.XML_CONTENT 
      columns 
      seq for ordinality, 
      STUDENT_NAME Varchar2(500) PATH 'cd[@name="STUDENT_NAME"]/@data' 
    ) a 
WHERE t.ID_FILE = 1; 

, если вы разместили XML в BLOB и не хранятся в виде XMLTYPE из сгустка, а затем преобразовать в выберите с :

select /*+ cursor_sharing_exact */ a.* 
from XMLTABLE('/XML/highschool/class/user' PASSING 
      (SELECT xmltype.createxml(XML_CONTENT, NLS_CHARSET_ID('UTF8'), null) 
       FROM T_FILES 
       WHERE ID_FILE = 1) 
      columns 
      STUDENT_NAME Varchar2(500) PATH 'cd[@name="STUDENT_NAME"]/@data' 
    ) a; 

ie. xmltype.createxml(XML_CONTENT, NLS_CHARSET_ID('UTF8'), null). измените набор символов, если это необходимо.

+0

спасибо. Я был сосредоточен на синтаксисе SQL и не заметил отсутствующего символа косой черты. – LSdev

Смежные вопросы