Oracle如何使用sqlldr将图片加载到blob列中

时间:2013-08-06 11:48:20

标签: oracle blob sql-loader

我想将员工照片加载到表per_images中。 Per_images曾经有一个很长的原始列用于图像,但这已经变为blob。

以下用于处理长原始列的sql loader控制文件:

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

其中9529是jpg图片的大小。我应该如何更改原始(9529)而不是允许加载到blob列?

1 个答案:

答案 0 :(得分:2)

我通常使用不同的方法使用SQL * Loader加载BLOB数据。基本上我导入一个包含文件名的文本文件,然后在控制文件中,我告诉SQL * Loader实际内容来自一个lobfile。

在您的情况下,这意味着您需要创建包含(仅)jpg文件名的文本文件。然后控制文件应如下所示:

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
)

输入文件data.txt将如下所示:

0211664.jpg

最重要的是image lobfile ...部分在最后,并且任何常量定义首先出现在控制文件中。

使用这种方法对我来说似乎更简单,因为您不需要知道输入文件的大小,并且可以使用SQL * Loader运行加载多张图片,如果需要,这可能会快得多加载大量图片。

如果要加载多张图片,输入文件需要包含目前在控制文件中提供的常量值。请输入以下输入文件:

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

然后你可以用一个控制文件加载所有三张图片:

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
)

控制文件永远不会改变,只会改变data.txt文件的内容。


如果raw(9529)被完全删除,您的原始控制文件适用于我:

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