Tôi thường sử dụng một cách khác để tải dữ liệu BLOB bằng SQL * Loader. Về cơ bản, tôi nhập một tệp văn bản có chứa tên tệp và trong tệp điều khiển, sau đó tôi nói với SQL * Loader rằng nội dung thực sự đến từ một tệp lob.
Trong trường hợp của bạn, điều này có nghĩa là bạn sẽ cần tạo tệp văn bản chứa (chỉ) tên tệp của jpg. Sau đó, tệp điều khiển sẽ trông giống như sau:
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 )
Tệp đầu vào data.txt
sau đó sẽ giống như sau:
0211664.jpg
Điều quan trọng là image lobfile ...
là phần cuối và bất kỳ định nghĩa hằng số nào đều xuất hiện đầu tiên trong tệp điều khiển.
Sử dụng loại phương pháp này có vẻ đơn giản hơn nhiều đối với tôi vì bạn không cần biết kích thước của tệp đầu vào và bạn có thể tải nhiều hơn một hình ảnh bằng cách chạy SQL * Loader, điều này có lẽ nhanh hơn rất nhiều nếu bạn cần tải một số lượng lớn hình ảnh.
Nếu bạn muốn tải nhiều ảnh, tệp đầu vào cần phải chứa các giá trị không đổi mà bạn đã cung cấp cho đến nay bên trong tệp điều khiển. Lấy tệp đầu vào sau:
6598,PER_PEOPLE_F,0211664.jpg 6599,PER_PEOPLE_F,0123456.jpg 6600,PER_PEOPLE_X,0987654.jpg
Sau đó, bạn có thể tải cả ba ảnh bằng một tệp điều khiển duy nhất:
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 )
Tệp điều khiển sẽ không bao giờ thay đổi, chỉ nội dung của data.txt
tệp.
Tệp điều khiển ban đầu của bạn phù hợp với tôi, nếu raw(9529)
bị xóa hoàn toàn:
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" )