Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Beim Laden von XML-Daten wird die Fehlermeldung angezeigt, dass meine Steuerdatei auf ein nicht vorhandenes Feld verweist

Sie scheinen ein paar Möglichkeiten zu verwechseln, dies zu tun. Der Fehler liegt daran, dass versucht wird, "test_file.xml" zu interpretieren innerhalb von LOBFILE() als Feldbezug.

Wenn Sie wissen, dass Sie nur ein XML-Dokument aus einer einzigen Textdatei laden, können Sie Ihre Steuerdatei erstellen:

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

Die BEGINDATA Abschnitt hat eine Zeile mit einem Füllzeichen für jedes XML-Dokument in der Datei, und da es nur eines gibt, gibt es ein einziges Füllzeichen.

Beachten Sie die CONSTANT Dadurch wird nach einer Datei mit diesem Namen gesucht, nicht nach einem Feld. Die Protokolldatei zeigt diesen statischen Namen:

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.

Um ein Feld zu verwenden, hätten Sie eine Datendatei mit dem Dateinamen, nennen wir sie test_loading.dat passend zum Steuerdateinamen, der Folgendes enthält:

test_file.xml

Und eine Steuerdatei, die das als INFILE und den Inhalt ihres ersten Felds als Dateinamen verwendet:

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

Dieses Mal zeigt die Protokolldatei, dass der Name dynamisch abgerufen wird:

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.

Lesen Sie mehr in der Dokumentation .

Entweder wird für Sie arbeiten. Da Sie in Ihrem Beispiel nur eine einzige Datei haben, ist die erste Version möglicherweise etwas einfacher, aber wenn Sie mehrere Dateien laden (mit einer Tabellenzeile pro Datei), ist die zweite Version nützlicher.