Domanda

Ho un file XML di esempio creato usando Editplus (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>

Il mio obiettivo qui è quello di ottenere queste informazioni nella tabella Oracle DB. Come suggerito qui https://stackoverflow.com/questions/998055?sort=newest#sort-top, ho provato ad eseguire i comandi sql. Ma non ci è riuscito

========================= sql query 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

Nell'output, vedo che metà del file XML è stata troncata. E il tipo di codifica nell'output è visto come WINDOWS-1252. Qualcuno potrebbe spiegare perché sta accadendo così?

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

=============================== sql query 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

=============================================== ====================== La stessa query funzionava qui https://stackoverflow.com/questions/998055?sort=newest#sort- top . Ma per me no. Ho Oracle 10g installato sulla mia macchina. Qualcuno potrebbe suggerire le correzioni per far funzionare le query.

Grazie.

È stato utile?

Soluzione

Considerando il tuo primo punto, l'output viene troncato solo sul display. È possibile modificare il numero di byte visualizzati in SQL * Plus con 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>

Come avrai notato, il tuo set di caratteri verrà modificato secondo i parametri della tua sessione NLS (i-e: il file verrà tradotto nel set di caratteri del tuo client).

Per il secondo punto:

  • Quale versione di SQL * Plus stai usando? Potrebbe essere più vecchio del database e non riconoscere la sintassi
  • potresti pubblicare la query esatta digitandola in SQL * Plus (utilizza la funzione CODICE di SO)

perché non riesco a riprodurre con 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

Aggiornamento: questa sintassi XMLTable deve essere una nuova funzionalità di 10gR2 (10.2. *) (necessita di conferma)

Puoi comunque usare un altro metodo di accesso ai dati XML (descritto in un'altra 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

Altri suggerimenti

Ho avuto lo stesso identico problema, mi chiedevo perché:

encoding="UTF-8"

modificato in

encoding="WINDOWS-1250"

nel mio caso (dopo il caricamento).

Poi ho capito cosa fa Oracle qui: converte l'xml codificato utf-8 nel set di caratteri predefinito del database, per poterlo archiviare. Ecco perché cambia il valore di "codifica". Se il set di caratteri predefinito del tuo databse è utf-8, allora 'encodig' non cambierà.

Se il tuo xem in realtà ha caratteri codificati utf-8, quindi provare a caricarlo nel database con nls_charset_id ('WINDOWS-1252') genererà un errore.

Quindi, per farla breve: non dovresti preoccuparti di encoding = " UTF-8 " cambiando in encoding = " WINDOWS-1252 " , semplicemente ignoralo - il database sta facendo il suo lavoro.

Grazie per l'aiuto. 'set Long 4000' risolto il problema di troncamento.

Ma sto ancora lottando per far funzionare la seconda query. La mia versione sqlplus è "SQL * Plus: versione 10.1.0.2.0". Pensi che la versione sia il problema.

Ecco il codice che ho provato.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top