从Oracle DB中提取100 K图像的最快方法是什么?

时间:2011-01-18 17:38:19

标签: c# oracle10g blob rdbms relational-database

我想到的选项是:

1)基于C#Console的应用程序将图像提取到Windows文件系统。

2)java app在基于unix的文件系统上提取图像。

您能想到的任何其他方法,请告诉我。大约有101,234条记录,每个BLOB列可能有1 MB到6 MB之间的文件。

1 个答案:

答案 0 :(得分:1)

如果你想要速度,我建议你使用PL / SQL存储过程直接将图像保存到文件中。它应该比外部程序更快

DECLARE
t_blob BLOB;
t_len NUMBER;
t_file_name VARCHAR2(100);
t_output UTL_FILE.file_type;
t_TotalSize number;
t_position number := 1;
t_chucklen NUMBER := 4096;
t_chuck raw(4096);
t_remain number;
BEGIN
-- Get length of blob
SELECT DBMS_LOB.getlength (PHOTO), ename || '_1.jpg'
INTO t_TotalSize, t_file_name FROM DEMO WHERE ENAME ='moon';
t_remain := t_TotalSize;
-- The directory TEMPDIR should exist before executing 
t_output := UTL_FILE.fopen ('TEMPDIR', t_file_name, 'wb', 32760);
-- Get BLOB 
SELECT PHOTO INTO t_blob FROM DEMO WHERE ENAME ='moon';
-- Retrieving BLOB
WHILE t_position < t_TotalSize 
LOOP
DBMS_LOB.READ (t_blob, t_chucklen, t_position, t_chuck);
UTL_FILE.put_raw (t_output, t_chuck);
UTL_FILE.fflush (t_output);
t_position := t_position + t_chucklen;
t_remain := t_remain - t_chucklen;
IF t_remain < 4096
THEN
t_chucklen := t_remain;
END IF;
END LOOP;
END;

选中此Link