Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Podczas ładowania danych XML pojawia się błąd mówiący, że mój plik kontrolny odwołuje się do nieistniejącego pola

Wydaje się, że mieszasz kilka sposobów na zrobienie tego. Błąd jest spowodowany tym, że próbuje zinterpretować "test_file.xml" wewnątrz LOBFILE() jako odniesienie do pola.

Jeśli wiesz, że załadujesz tylko jeden dokument XML z jednego pliku tekstowego, możesz utworzyć plik kontrolny:

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

BEGINDATA sekcja zawiera wiersz ze znakiem wypełniającym dla każdego dokumentu XML w pliku, a ponieważ jest tylko jeden, jest jeden wypełniacz.

Zwróć uwagę na CONSTANT co sprawia, że ​​szuka pliku o nazwie tak, a nie pola. Plik dziennika pokazuje tę statyczną nazwę:

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.

Aby użyć pola, musisz mieć plik danych z nazwą pliku, nazwijmy go test_loading.dat aby dopasować nazwę pliku kontrolnego, który zawiera:

test_file.xml

I plik kontrolny, który używa tego jako INFILE, a zawartość jego pierwszego pola jako nazwę pliku:

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

Tym razem plik dziennika pokazuje, że nazwa jest pobierana dynamicznie:

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.

Więcej informacji znajdziesz w dokumentacji .

Albo będzie dla ciebie pracować. Ponieważ w swoim przykładzie masz tylko jeden plik, pierwsza wersja może być nieco prostsza, ale jeśli będziesz ładować wiele plików (z jednym wierszem tabeli na plik), druga wersja jest bardziej przydatna.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. automatyzacja wyrocznia skryptu wycofywania

  2. Skrypt powłoki z sqlplus i znakami specjalnymi na haśle

  3. Funkcja JPQL LOWER w wyrażeniu IN

  4. Oracle — jak uzyskać rzeczywisty rozmiar konkretnego wiersza?

  5. tabela lub widok nie istnieje