我使用的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的。 可能有人建议修正,使查询工作。
谢谢。
考虑到你的第一点,你的输出只截断显示。 你可以改变多少字节,显示在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
我有完全相同的问题,我想知道为什么:
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"
,就忽视它-数据库在做自己的工作。
谢谢您的帮助。 “设置长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