Obvykle používám jiný způsob načítání dat BLOB pomocí SQL*Loader. V podstatě importuji textový soubor, který obsahuje názvy souborů a v kontrolním souboru pak SQL*Loaderu řeknu, že skutečný obsah pochází z lobfile.
Ve vašem případě to znamená, že budete muset vytvořit textový soubor, který obsahuje (pouze) název souboru jpg. Ovládací soubor by pak měl vypadat takto:
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 )
Vstupní soubor data.txt
by pak vypadalo takto:
0211664.jpg
Je důležité, aby image lobfile ...
část je na konci a že jakákoli definice konstanty je v řídicím souboru na prvním místě.
Použití tohoto druhu přístupu se mi zdá mnohem jednodušší, protože nepotřebujete znát velikost vstupního souboru a můžete načíst více než jeden obrázek pomocí běhu SQL*Loader, což je pravděpodobně mnohem rychlejší, pokud potřebujete načíst soubor velké množství obrázků.
Chcete-li načíst více než jeden obrázek, vstupní soubor musí obsahovat konstantní hodnoty, které jste dosud zadali v řídicím souboru. Vezměte následující vstupní soubor:
6598,PER_PEOPLE_F,0211664.jpg 6599,PER_PEOPLE_F,0123456.jpg 6600,PER_PEOPLE_X,0987654.jpg
Poté můžete načíst všechny tři obrázky pomocí jediného kontrolního souboru:
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 )
Kontrolní soubor se nikdy nezmění, pouze obsah data.txt
soubor.
Váš původní kontrolní soubor mi funguje, pokud raw(9529)
je zcela odstraně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" )