2013-04-02 24 views
0

我需要使用SQL查询(Oracle 11g R2)生成从XML文件(以BLOB格式存储)填充的表。该表应该包含每个学生一行。如何从存储为BLOB格式的XML文件生成表格?

当我尝试使用下面的语法:

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 

VS

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从BLOB,那么在选择与转换:

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; 

即, xmltype.createxml(XML_CONTENT, NLS_CHARSET_ID('UTF8'), null)。根据需要更改字符集。

+0

非常感谢。我专注于SQL语法,并没有注意到缺少的斜线符号。 – LSdev

相关问题