Oracle
 sql >> Base de données >  >> RDS >> Oracle

Le chargement des données XML génère une erreur indiquant que mon fichier de contrôle fait référence à un champ inexistant

Vous semblez mélanger plusieurs façons de procéder. L'erreur est due au fait qu'il essaie d'interpréter le "test_file.xml" à l'intérieur de LOBFILE() comme référence de champ.

Si vous savez que vous ne chargerez qu'un seul document XML à partir d'un seul fichier texte, vous pouvez créer votre fichier de contrôle :

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

Le BEGINDATA a une ligne avec un caractère de remplissage pour chaque document XML du fichier, et comme il n'y en a qu'un, il n'y a qu'un seul remplissage.

Notez la CONSTANT ce qui le fait rechercher un fichier appelé ainsi, pas un champ. Le fichier journal affiche ce nom statique :

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.

Pour utiliser un champ, vous auriez un fichier de données avec le nom du fichier, appelons-le test_loading.dat pour correspondre au nom du fichier de contrôle, qui contient :

test_file.xml

Et un fichier de contrôle qui utilise cela comme INFILE, et le contenu de son premier champ comme nom de fichier :

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

Cette fois, le fichier journal indique que le nom est récupéré dynamiquement :

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.

En savoir plus dans la documentation .

L'un ou l'autre fonctionnera pour vous. Comme vous n'avez qu'un seul fichier dans votre exemple, la première version peut être légèrement plus simple, mais si vous chargez plusieurs fichiers (avec une ligne de tableau par fichier), la deuxième version est plus utile.