Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle como carregar uma imagem em uma coluna blob usando sqlldr


Eu costumo usar uma maneira diferente de carregar dados BLOB usando SQL*Loader. Basicamente importo um arquivo de texto que contém os nomes dos arquivos e no arquivo de controle, digo ao SQL*Loader que o conteúdo real vem de um arquivo lob.

No seu caso, isso significa que você precisaria criar um arquivo de texto que contenha (somente) o nome do arquivo do jpg. O arquivo de controle deve ficar assim:
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
)

O arquivo de entrada data.txt então ficaria assim:
0211664.jpg

É importante que o image lobfile ... parte está no final e que qualquer definição de constante vem primeiro no arquivo de controle.

Usar esse tipo de abordagem parece muito mais simples para mim porque você não precisa saber o tamanho do arquivo de entrada e pode carregar mais de uma imagem com uma execução do SQL*Loader, que provavelmente é muito mais rápida se você precisar carregar um grande quantidade de fotos.

Se você quiser carregar mais de uma imagem, o arquivo de entrada precisa conter os valores constantes que você forneceu até agora dentro do arquivo de controle. Pegue o seguinte arquivo de entrada:
6598,PER_PEOPLE_F,0211664.jpg
6599,PER_PEOPLE_F,0123456.jpg
6600,PER_PEOPLE_X,0987654.jpg

Então você pode carregar todas as três imagens com um único arquivo de controle:
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
)

O arquivo de controle nunca será alterado, apenas o conteúdo do data.txt Arquivo.

Seu arquivo de controle original funciona para mim, se o raw(9529) é removido 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"
)