Вопрос

У меня есть образец xml-файла, созданного с помощью Editplus (в Windows).

  < ?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>

Моя цель здесь - занести эту информацию в таблицу Oracle DB.Как было предложено здесь 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 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 4 FROM dual), 5 XMLTable('for $i in /badges/row 6 return $i' 7 passing xml_data 8 columns UserId NUMBER path '@UserId', 9 Name VARCHAR2(50) path '@Name', 10 dt VARCHAR2(25) path '@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-данным (описанный в еще один ТАКОЙ):

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"

в моем случае (после загрузки).

Тогда я понял, что здесь делает Oracle:он преобразует XML в кодировке utf-8 в набор символов вашей базы данных по умолчанию, чтобы иметь возможность сохранить его.Вот почему он изменяет значение 'encoding' .Если набор символов по умолчанию в вашей базе данных равен 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top