Frage

Ich habe eine XML-Beispieldatei mit Editplus erstellt (in 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>

Mein Ziel ist es, diese Informationen in Oracle-DB-Tabelle zu erhalten. Wie hier vorgeschlagen https://stackoverflow.com/questions/998055?sort=newest#sort-top, habe ich versucht, die sQL-Befehle auszuführen. Aber konnte nicht gelingen,

========================= SQL-Abfrage 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

In der Ausgabe, ich sehe die Hälfte der XML-Datei abgeschnitten wurde. Und der Codierungstyp in Ausgabe wird als WINDOWS-1252 gesehen. Könnte jemand erklären, warum geschieht es so?

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

=============================== SQL-Abfrage 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

=============================================== ====================== Die gleiche Abfrage arbeitet hier https://stackoverflow.com/questions/998055?sort=newest#sort- Top-. Aber für mich ist es nicht. Ich habe Oracle 10g auf meinem Rechner installiert. Könnte jemand die Korrekturen schlagen die Abfragen zu arbeiten.

Danke.

War es hilfreich?

Lösung

Unter Berücksichtigung Ihrer ersten Punkt wird die Ausgabe auf dem Display nur abgeschnitten. Sie können ändern, wie viele Bytes in SQL angezeigt werden * Plus mit 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>

Wie Sie bemerkt haben, wird Ihr Zeichensatz pro Ihren NLS-Session-Parameter geändert werden (i-e: die Datei auf den Zeichensatz Ihres Kunden übersetzt wird)

.

Für den zweiten Punkt:

  • Welche Version von SQL * Plus verwenden Sie? Es könnte sein, die älter als die Datenbank und nicht die Synthax Erkennung
  • könnten Sie die genaue Abfrage schreiben, wie Sie es in SQL getippt * Plus (Bitte verwenden Sie die CODE-Funktion von SO)

, weil ich mit Oracle 10.2.0.3 nicht reproduzieren können:

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

Update: (. 10.2 *) Diese XMLTable Synthax eine neue Funktion des 10gR2 sein muss (Bedürfnisse Bestätigung)

Sie können jedoch eine andere Methode für den Zugriff auf XML-Daten verwenden (beschrieben in

Andere Tipps

ich genau das gleiche Problem hatte, ich habe mich gefragt, warum:

encoding="UTF-8"

geändert

encoding="WINDOWS-1250"

in meinem Fall (nach dem Laden).

Dann wurde mir klar, was Oracle tut sich hier: es wandelt die utf-8 codiert xml auf den Standardzeichensatz Ihrer Datenbank, um in der Lage sein, es zu speichern. Deshalb ist es den Wert von ‚encoding‘ ändert. Wenn der Standardzeichensatz Ihrer databse ist utf-8, dann ‚encodig‘ wird sich nicht ändern.

Wenn Ihr xml wirklich hat utf-8-codierte Zeichen, dann versuchen, es in der Datenbank mit nls_charset_id('WINDOWS-1252') zu laden einen Fehler werfen.

So ist es zu setzen. Kurz: Sie sollten nicht über encoding="UTF-8" Sorge Wechsel encoding="WINDOWS-1252", einfach ignorieren - die Datenbank tut seine Arbeit

Danke für die Hilfe. ‚Set Lange 4000‘ fixed das Abschneiden Problem.

Aber ich bin immer noch kämpfen, das zweite Abfrage zum Laufen zu bringen. Meine sqlplus Version ist "SQL * Plus: Release 10.1.0.2.0". Glauben Sie, dass Version das Problem.

Hier ist der Code, den ich versucht habe.

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
scroll top