如何在Oracle中将Blob存储的图片批量导出到文件夹

操作系统以Windows为例,Linux可自行对目录进行更改

1、以管理员用户登陆设置可操作目录

--说明:建议以SYS账户直接登录,将权限授予需导出图像文件的用户(如test)

CREATE DIRECTORY privilege is granted only to SYS and SYSTEM by default.
create or replace directory BLOBDIR as 'D:\IMG'; --D:\IMG文件夹必须首先在操作系统中创建
grant read,write on directory BLOBDIR to test; --test为需导出图像文件用户
GRANT EXECUTE ON utl_file TO test;
select * from ALL_DIRECTORIES;--查看目录是否已创建成功

2、普通用户登陆,编写存储过程


--以需导出图像文件用户test账户登录
--以下为导出表TBHUMANSIGNIMAGE 的前5张图片示例:
--表TBHUMANSIGNIMAGE 的示例数据:

--=====================
--HUMANID SIGNIMAGE
--ID1 BLOB格式图片
--ID2 BLOB格式图片
--ID3 BLOB格式图片
--ID4 BLOB格式图片
--ID5 BLOB格式图片
--.. ..
--=====================

创建存储过程


--i_xh为变量
CREATE OR REPLACE PROCEDURE GET_PIC_BLOB(i_xh VARCHAR2) IS
l_file UTL_FILE.FILE_TYPE;
l_buffer RAW(32767);
--注:若图片非常大,需定义为LONG RAW(32760),最大可支持2G字节的数据
l_amount BINARY_INTEGER := 32767;
l_pos INTEGER := 1;
l_blob BLOB;
l_blob_len INTEGER;
BEGIN
select SIGNIMAGE into l_blob from TBHUMANSIGNIMAGE where HUMANID=i_xh;--将PDATA数据写入l_blob变量
l_blob_len := DBMS_LOB.GETLENGTH(l_blob);
l_file := UTL_FILE.FOPEN('BLOBDIR', i_xh || '.jpg', 'WB', l_blob_len);
WHILE l_pos < l_blob_len LOOP
DBMS_LOB.READ(l_blob, l_amount, l_pos, l_buffer);
UTL_FILE.PUT_RAW(l_file, l_buffer, TRUE);
l_pos := l_pos + l_amount;
END LOOP;
UTL_FILE.FCLOSE(l_file);
EXCEPTION
--WHEN NO_DATA_FOUND THEN
--DBMS_OUTPUT.put_line('no data : ' || i_xh);
WHEN OTHERS THEN
IF UTL_FILE.IS_OPEN(l_file) THEN
UTL_FILE.FCLOSE(l_file);
RAISE;
END IF;
END GET_PIC_BLOB;


3、编写PL/SQL 块,循环执行该存储过程


declare
cursor cur is
select HUMANID from TBHUMANSIGNIMAGE where rownum <= 200; --导出前200张
begin
for rec in cur loop
GET_PIC_BLOB(rec.HUMANID);
end loop;
end;


结束 转自【百度文库】 实测有效

你可能感兴趣的:(如何在Oracle中将Blob存储的图片批量导出到文件夹)