XML到Oracle数据库表:遇到问题(xml to oracle DB table : encou

2019-09-22 05:39发布

我使用的Editplus创建示例XML文件(在Windows)。

    <?XML版本= “1.0” 编码= “UTF-8”?>    <徽章>      <行用户ID = “3714” 名称= “教师” 日期= “2008-09-15T08:55:03.923”/>      <行用户ID = “994” 名称= “教师” 日期= “2008-09-15T08:55:03.957”/>    </徽章> 

在这里,我的目标是获得此信息到Oracle数据库表。 由于这里建议https://stackoverflow.com/questions/998055?sort=newest#sort-top ,我试图执行SQL命令。 但是不能成功,

========================= SQL查询1个====================== ======

SQL> SELECT XMLTYPE(bfilename('D', 'tmp.xml'), nls_charset_id('UTF8')) xml_data FROM dual;

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

在输出中,我看到的XML文件的一半得到了截断。 和输出的编码类型被看作是WINDOWS-1252。 有人能解释为什么会发生这样的吗?

================================================== ========================

=============================== SQL查询2个================ ===============

  SQL> SELECT用户ID,姓名,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 4 FROM双), 5 XMLTable的('为$我在/徽章/行 6返回$ I” 7通过xml_data 8列用户ID NUMBER路径 '@UserId', 9名称VARCHAR2(50)路径 '@Name', 10 DT VARCHAR2(25)路径 '@date');

XMLTable('for $i in /badges/row * ERROR at line 5: ORA-00933: SQL command not properly ended

================================================== ===================同样的查询正在这里https://stackoverflow.com/questions/998055?sort=newest#sort-top 。 但对我来说没有。 我有我的机器上安装Oracle 10g的。 可能有人建议修正,使查询工作。

谢谢。

Answer 1:

考虑到你的第一点,你的输出只截断显示。 你可以改变多少字节,显示在SQL * Plus与SET LONG

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>

正如您已经注意到,您的字符集将根据您的NLS会话参数进行修改(即:该文件将被转换为字符集的客户端)。

对于第二点:

  • 您正在使用什么版本的SQL * Plus的? 它可能会比旧的数据库,而不是承认synthax
  • 你可以发布准确的查询如您在SQL键入它* Plus中(请使用SO码功能)

因为我无法与Oracle 10.2.0.3重现:

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

更新:此XMLTable的synthax必须是10gR2中的一项新功能(10.2 *)(需要确认)

然而可以使用访问XML数据(在所描述的另一种方法, 另一种SO ):

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


Answer 2:

我有完全相同的问题,我想知道为什么:

encoding="UTF-8"

变成

encoding="WINDOWS-1250"

在我的情况(后装)。

然后我意识到甲骨文在这里所做的:它转换UTF-8编码XML的默认字符集数据库中,以便能够存储它。 这就是为什么它改变“编码”的值。 如果设置你的DATABSE的默认字符是utf-8,然后“encodig”不会改变。

如果您的XML 实际上有UTF-8编码的字符,然后试图将其加载到与数据库nls_charset_id('WINDOWS-1252')将抛出一个错误。

所以把它简称:你不应该担心encoding="UTF-8"改变为encoding="WINDOWS-1252" ,就忽视它-数据库在做自己的工作。



Answer 3:

谢谢您的帮助。 “设置长4000”固定截断问题。

但我还是努力让第二个查询运行。 我的sqlplus版本是 “在SQL * Plus:释放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


文章来源: xml to oracle DB table : encountering problems