sql >> Base de Datos >  >> RDS >> Oracle

xml a la tabla DB de Oracle:encontrar problemas

Teniendo en cuenta su primer punto, su salida solo se trunca en la pantalla. Puede cambiar la cantidad de bytes que se muestran en 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>

Como habrá notado, su conjunto de caracteres se modificará según los parámetros de su sesión NLS (es decir, el archivo se traducirá al conjunto de caracteres de su cliente).

Para el segundo punto:

  • ¿Qué versión de SQL*Plus está utilizando? Puede ser más antiguo que la base de datos y no reconocer la sintaxis
  • ¿podría publicar la consulta exacta tal como la escribió en SQL*Plus (utilice la función CÓDIGO de SO)

porque no puedo reproducir 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

Actualización: Esta sintaxis de XMLTable debe ser una característica nueva de 10gR2 (10.2.*) (necesita confirmación)

Sin embargo, puede usar otro método para acceder a los datos XML (descrito en otro 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