2009-08-05 7 views
2

Ich habe eine Beispiel-XML-Datei mit Editplus erstellt (in Windows).XML zu Oracle DB-Tabelle: Probleme aufgetreten

 
    < ?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 der Ausgabe wird als WINDOWS-1252 angesehen. Könnte jemand erklären, warum es so geschieht?

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

================== ============= 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 funktionierte hier https://stackoverflow.com/questions/998055?sort=newest#sort-top. Aber für mich ist es nicht so. Ich habe Orakel 10g auf meiner Maschine installiert. Könnte jemand die Korrekturen vorschlagen, damit die Abfragen funktionieren?

Danke.

Antwort

1

Wenn Sie Ihren ersten Punkt betrachten, wird Ihre Ausgabe nur auf dem Display abgeschnitten. Sie können, wie viele Bytes ändern in SQL * angezeigt 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 Ihre NLS-Session-Parameter geändert werden (dh: die Datei in den Zeichensatz übersetzt werden Ihres Kunden).

Zum zweiten Punkt:

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

, weil ich nicht wiedergeben kann, mit 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 

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

Sie jedoch ein anderes Verfahren zur Herstellung eines verwenden können XML Daten verarbeiten (beschrieben in another 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 
0

Danke für die Hilfe. 'set Long 4000' hat das abgeschnittene Problem behoben.

Aber ich kämpfe immer noch um die zweite Abfrage zu bekommen. Meine sqlplus-Version ist "SQL * Plus: Release 10.1.0.2.0". Glaubst du, dass diese Version das Problem ist?

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 
+0

@Shafi: Ich habe eine andere Methode hinzugefügt, um auf XML-Daten in meiner Antwort zuzugreifen. Diese Methode sollte mit Oracle 10gR1 funktionieren –

1

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

encoding="UTF-8" 

zu

geändert
encoding="WINDOWS-1250" 

in meinem Fall (nach dem Laden).

Dann habe ich erkannt, was Oracle hier tut: Es konvertiert die utf-8-codierten xml in den Standard-Zeichensatz Ihrer Datenbank, um sie speichern zu können. Deshalb ändert sich der Wert von "Kodierung". Wenn der Standardzeichensatz Ihrer Datenbank utf-8 ist, wird 'encodig' nicht geändert.

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

Also um es kurz zu machen: Sie sollten sich keine Sorgen über Wechsel zu encoding="WINDOWS-1252" machen, einfach ignorieren - die Datenbank macht ihren Job.