Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

O carregamento de dados XML recebe um erro dizendo que meu arquivo de controle faz referência a um campo inexistente


Você parece estar misturando algumas maneiras de fazer isso. O erro é porque ele está tentando interpretar o "test_file.xml" dentro de LOBFILE() como referência de campo.

Se você sabe que carregará apenas um documento XML de um único arquivo de texto, pode criar seu arquivo de controle:
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

O BEGINDATA seção tem uma linha com um caractere de preenchimento para cada documento XML no arquivo e, como há apenas um, há um único preenchimento.

Observe o CONSTANT o que faz com que procure um arquivo chamado that, não um campo. O arquivo de log mostra esse nome 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 um campo você teria um arquivo de dados com o nome do arquivo, vamos chamá-lo de test_loading.dat para corresponder ao nome do arquivo de controle, que contém:
test_file.xml

E um arquivo de controle que usa isso como INFILE e o conteúdo de seu primeiro campo como o nome do arquivo:
LOAD DATA
INFILE test_loading.dat
append INTO TABLE TEST_XML
XMLType(XMLDATA)
FIELDS
(
    filename FILLER CHAR(30),
    XMLDATA LOBFILE(filename) TERMINATED BY EOF
)

Desta vez, o arquivo de log mostra que o nome está sendo recuperado 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.

Leia mais na documentação .

Qualquer um funcionará para você. Como você tem apenas um único arquivo em seu exemplo, a primeira versão pode ser um pouco mais simples, mas se você estiver carregando vários arquivos (com uma linha de tabela por arquivo), a segunda versão é mais útil.