sql >> Base de Datos >  >> RDS >> Oracle

Oracle cómo cargar una imagen en una columna de blob usando sqlldr

Usualmente uso una forma diferente de cargar datos BLOB usando SQL*Loader. Básicamente, importo un archivo de texto que contiene los nombres de los archivos y, en el archivo de control, le digo a SQL*Loader que el contenido real proviene de un archivo lob.

En su caso, esto significa que necesitaría crear un archivo de texto que contenga (solo) el nombre de archivo del jpg. El archivo de control debería verse así:

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
)

El archivo de entrada data.txt entonces se vería así:

0211664.jpg

Es importante que el image lobfile ... parte está al final y que cualquier definición constante viene primero en el archivo de control.

Usar este tipo de enfoque me parece mucho más simple porque no necesita saber el tamaño del archivo de entrada y puede cargar más de una imagen con una ejecución de SQL*Loader, que probablemente sea mucho más rápida si necesita cargar un gran cantidad de imágenes.

Si desea cargar más de una imagen, el archivo de entrada debe contener los valores constantes que proporcionó hasta ahora dentro del archivo de control. Tome el siguiente archivo de entrada:

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

Luego puede cargar las tres imágenes con un único archivo de control:

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
)

El archivo de control nunca cambiará, solo el contenido de data.txt archivo.

Su archivo de control original funciona para mí, si el raw(9529) se elimina por completo:

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"
)