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

La carga de datos XML recibe un error que dice que mi archivo de control hace referencia a un campo inexistente

Parece que estás mezclando algunas formas de hacer esto. El error se debe a que está intentando interpretar el "test_file.xml" dentro de LOBFILE() como referencia de campo.

Si sabe que solo cargará un documento XML desde un único archivo de texto, puede crear su archivo de control:

LOAD DATA
INFILE *
append INTO TABLE TEST_XML
XMLType(XMLDATA)
FIELDS
(
    FILL FILLER CHAR(1),
    XMLDATA LOBFILE(CONSTANT test_file.xml) TERMINATED BY EOF
)
BEGINDATA
0

Los BEGINDATA tiene una fila con un carácter de relleno para cada documento XML en el archivo, y como solo hay uno, hay un único relleno.

Tenga en cuenta la CONSTANT lo que hace que busque un archivo llamado así, no un campo. El archivo de registro muestra ese nombre estático:

Table TEST_XML, loaded from every logical record.
Insert option in effect for this table: APPEND

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
FILL                                FIRST     1           CHARACTER
  (FILLER FIELD)
XMLDATA                           DERIVED     *  EOF      CHARACTER
    Static LOBFILE.  Filename is test_file.xml


Table TEST_XML:
  1 Row successfully loaded.
  0 Rows not loaded due to data errors.
  0 Rows not loaded because all WHEN clauses were failed.
  0 Rows not loaded because all fields were null.

Para usar un campo, tendría un archivo de datos con el nombre del archivo, llamémoslo test_loading.dat para que coincida con el nombre del archivo de control, que contiene:

test_file.xml

Y un archivo de control que usa eso como INFILE, y el contenido de su primer campo como el nombre del archivo:

LOAD DATA
INFILE test_loading.dat
append INTO TABLE TEST_XML
XMLType(XMLDATA)
FIELDS
(
    filename FILLER CHAR(30),
    XMLDATA LOBFILE(filename) TERMINATED BY EOF
)

Esta vez, el archivo de registro muestra que el nombre se recupera dinámicamente:

Table TEST_XML, loaded from every logical record.
Insert option in effect for this table: APPEND

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
FILENAME                            FIRST    30           CHARACTER
  (FILLER FIELD)
XMLDATA                           DERIVED     *  EOF      CHARACTER
    Dynamic LOBFILE.  Filename in field FILENAME


Table TEST_XML:
  1 Row successfully loaded.
  0 Rows not loaded due to data errors.
  0 Rows not loaded because all WHEN clauses were failed.
  0 Rows not loaded because all fields were null.

Lea más en la documentación .

Cualquiera de los dos funcionará para usted. Como solo tiene un archivo en su ejemplo, la primera versión puede ser un poco más simple, pero si va a cargar varios archivos (con una fila de tabla por archivo), la segunda versión es más útil.