Sql xml到oracle DB表:遇到问题

Sql xml到oracle DB表:遇到问题,sql,oracle,oracle10g,ora-00933,Sql,Oracle,Oracle10g,Ora 00933,我有一个在windows中使用Editplus创建的示例xml文件 ===================================================================== 同样的查询在这里工作。但对我来说不是。 我的机器上安装了oracle 10g。 有没有人能提出一些修正建议,让这些问题得以解决 谢谢。考虑到您的第一点,您的输出仅在显示时被截断。您可以使用SET LONG更改SQL*Plus中显示的字节数: 更新:此XMLTable synthax必须是1

我有一个在windows中使用Editplus创建的示例xml文件

===================================================================== 同样的查询在这里工作。但对我来说不是。 我的机器上安装了oracle 10g。 有没有人能提出一些修正建议,让这些问题得以解决


谢谢。

考虑到您的第一点,您的输出仅在显示时被截断。您可以使用SET LONG更改SQL*Plus中显示的字节数:

更新:此XMLTable synthax必须是10gR2 10.2的新功能。*需要确认

但是,您可以使用另一种访问XML数据的方法,如中所述:


谢谢你的帮助set Long 4000'修复了截断问题

但我仍在努力运行第二个查询。我的sqlplus版本是SQL*Plus:Release 10.1.0.2.0。你认为那个版本是问题所在吗

这是我尝试过的代码

SQL> select xmltype(bfilename('D','tmp.xml'),nls_charset_id('WINDOWS-1252')) xml_data from dual;

XML_DATA
-----------------------------------------------
<?xml version="1.0" encoding="WINDOWS-1252"?>
<badges>
  <row UserId="3714" Name


SQL> set LONG 4000
SQL> /

XML_DATA
--------------------------------------------------
<?xml version="1.0" encoding="WINDOWS-1252"?>
<badges>
 <row UserId="3714" Name="Teacher" Date="2008-09-15T08:55:03.923"/>
 <row UserId="994" Name="Teacher" Date="2008-09-15T08:55:03.957"/>
</badges>


SQL> SELECT UserId, NAME, to_timestamp(dt, 'YYYY-MM-DD"T"HH24:MI:SS.FF3') dt
2        FROM (SELECT XMLTYPE(bfilename('D', 'tmp.xml'),
3                     nls_charset_id('WINDOWS-1252')) xml_data FROM dual),
4             XMLTable('for $i in /badges/row
5                                 return $i'
6                       passing xml_data columns UserId NUMBER path '@UserId',
7                       NAME VARCHAR2(50) path '@Name',
8                       dt VARCHAR2(25) path '@Date');
       XMLTable('for $i in /badges/row
               *
ERROR at line 4:
ORA-00933: SQL command not properly ended

我也有同样的问题,我想知道为什么:

encoding="UTF-8"
改为

encoding="WINDOWS-1250"
在我的情况下,装载后

然后我意识到Oracle在这里做了什么:它将utf-8编码的xml转换为数据库的默认字符集,以便能够存储它。这就是为什么它会更改“encoding”的值。如果数据库的默认字符集为utf-8,则“encodig”不会更改

如果您的xml实际上包含utf-8编码字符,那么尝试使用nls_charset_id“WINDOWS-1252”将其加载到数据库中将抛出错误


简而言之:您不必担心encoding=UTF-8更改为encoding=WINDOWS-1252,只需忽略它-数据库正在完成它的工作。

@Shafi:我在回答中添加了另一种方法来访问XML数据。此方法应适用于Oracle 10gR1
SQL> SELECT XMLTYPE(bfilename('D', 'test.xml'), 
  2         nls_charset_id('WINDOWS-1252')) xml_data FROM dual;

XML_DATA
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<badges>
  <row UserId="3714" Name=

SQL> SET LONG 4000
SQL> /

XML_DATA
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<badges>
  <row UserId="3714" Name="Teacher" Date="2008-09-15T08:55:03.923"/>
  <row UserId="994" Name="Teacher" Date="2008-09-15T08:55:03.957"/>
</badges>
SQL> SELECT UserId, NAME, to_timestamp(dt, 'YYYY-MM-DD"T"HH24:MI:SS.FF3') dt
  2    FROM (SELECT XMLTYPE(bfilename('D', 'test.xml'),
  3                 nls_charset_id('WINDOWS-1252')) xml_data FROM dual),
  4         XMLTable('for $i in /badges/row
  5                             return $i'
  6                   passing xml_data columns UserId NUMBER path '@UserId',
  7                   NAME VARCHAR2(50) path '@Name',
  8                   dt VARCHAR2(25) path '@Date');

    USERID NAME      DT
---------- --------- ----------------------------
      3714 Teacher   15/09/08 08:55:03,923000000
       994 Teacher   15/09/08 08:55:03,957000000
SQL> SELECT extractvalue(column_value, '/row/@UserId') "userID",
  2         extractvalue(column_value, '/row/@Name') "Name",
  3         extractvalue(column_value, '/row/@Date') "Date"
  4    FROM TABLE(XMLSequence(XMLTYPE(bfilename('D', 'tmp.xml'),
  5                     nls_charset_id('WINDOWS-1252')).extract('/badges/row'))) t;

userID  Name      Date
------- --------- ------------------------
3718    Teacher   2008-09-15T08:55:03.923
994     Teacher   2008-09-15T08:55:03.957
SQL> select xmltype(bfilename('D','tmp.xml'),nls_charset_id('WINDOWS-1252')) xml_data from dual;

XML_DATA
-----------------------------------------------
<?xml version="1.0" encoding="WINDOWS-1252"?>
<badges>
  <row UserId="3714" Name


SQL> set LONG 4000
SQL> /

XML_DATA
--------------------------------------------------
<?xml version="1.0" encoding="WINDOWS-1252"?>
<badges>
 <row UserId="3714" Name="Teacher" Date="2008-09-15T08:55:03.923"/>
 <row UserId="994" Name="Teacher" Date="2008-09-15T08:55:03.957"/>
</badges>


SQL> SELECT UserId, NAME, to_timestamp(dt, 'YYYY-MM-DD"T"HH24:MI:SS.FF3') dt
2        FROM (SELECT XMLTYPE(bfilename('D', 'tmp.xml'),
3                     nls_charset_id('WINDOWS-1252')) xml_data FROM dual),
4             XMLTable('for $i in /badges/row
5                                 return $i'
6                       passing xml_data columns UserId NUMBER path '@UserId',
7                       NAME VARCHAR2(50) path '@Name',
8                       dt VARCHAR2(25) path '@Date');
       XMLTable('for $i in /badges/row
               *
ERROR at line 4:
ORA-00933: SQL command not properly ended
encoding="UTF-8"
encoding="WINDOWS-1250"