Oracle
 sql >> Database >  >> RDS >> Oracle

Il caricamento dei dati XML riceve un errore dicendo che il mio file di controllo fa riferimento a un campo inesistente

Sembra che tu stia confondendo alcuni modi per farlo. L'errore è dovuto al fatto che sta tentando di interpretare il "test_file.xml" dentro LOBFILE() come riferimento del campo.

Se sai che caricherai un solo documento XML da un singolo file di testo puoi creare il tuo file di controllo:

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

Il BEGINDATA la sezione ha una riga con un carattere di riempimento per ogni documento XML nel file e, poiché ce n'è solo uno, c'è un solo riempimento.

Nota il CONSTANT il che fa cercare un file chiamato così, non un campo. Il file di registro mostra quel nome statico:

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.

Per utilizzare un campo avresti un file di dati con il nome del file, chiamiamolo test_loading.dat in modo che corrisponda al nome del file di controllo, che contiene:

test_file.xml

E un file di controllo che lo usa come INFILE e il contenuto del suo primo campo come nome del file:

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

Questa volta il file di registro mostra che il nome viene recuperato dinamicamente:

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.

Leggi di più nella documentazione .

Entrambi funzioneranno per te. Poiché nel tuo esempio hai un solo file, la prima versione potrebbe essere leggermente più semplice, ma se caricherai più file (con una riga di tabella per file) la seconda versione è più utile.