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

Oracle come caricare un'immagine in una colonna BLOB usando sqlldr

Di solito uso un modo diverso per caricare i dati BLOB usando SQL*Loader. Fondamentalmente importo un file di testo che contiene i nomi dei file e nel file di controllo, quindi dico a SQL*Loader che il contenuto effettivo proviene da un lobfile.

Nel tuo caso questo significa che dovrai creare un file di testo che contenga (solo) il nome del file jpg. Il file di controllo dovrebbe quindi essere simile a questo:

LOAD DATA
infile data.txt
TRUNCATE
INTO TABLE per_images
FIELDS TERMINATED BY ',' TRAILING NULLCOLS
(
  input_file FILLER,
  image_id "PER_IMAGES_s.nextval",  
  parent_id constant 6598,
  table_name constant "PER_PEOPLE_F",  
  image lobfile(input_file) terminated by eof
)

Il file di input data.txt sarebbe quindi simile a questo:

0211664.jpg

È importante che il image lobfile ... parte è alla fine e che qualsiasi definizione di costante viene prima nel file di controllo.

L'uso di questo tipo di approccio mi sembra molto più semplice perché non è necessario conoscere la dimensione del file di input e puoi caricare più di un'immagine con un'esecuzione SQL*Loader che molto probabilmente è molto più veloce se devi caricare un grande quantità di immagini.

Se vuoi caricare più di un'immagine, il file di input deve contenere i valori costanti che hai fornito finora all'interno del file di controllo. Prendi il seguente file di input:

6598,PER_PEOPLE_F,0211664.jpg
6599,PER_PEOPLE_F,0123456.jpg
6600,PER_PEOPLE_X,0987654.jpg

Quindi puoi caricare tutte e tre le immagini con un unico file di controllo:

LOAD DATA
infile data.txt
TRUNCATE
INTO TABLE per_images
FIELDS TERMINATED BY ',' TRAILING NULLCOLS
(
  parent_id,
  table_name,
  input_file FILLER,
  image_id "PER_IMAGES_s.nextval",  
  image lobfile(input_file) terminated by eof
)

Il file di controllo non cambierà mai, solo il contenuto del data.txt file.

Il tuo file di controllo originale funziona per me, se il raw(9529) viene rimosso completamente:

options (bindsize 9529)
load data
infile 0211664.jpg "fix 9529"
append
into table PER_IMAGES
(
  image,
  parent_id constant 6598,
  table_name constant "PER_PEOPLE_F",
  image_id "PER_IMAGES_s.nextval"
)