1. 创建DIRECTORY并授权操作用户
--创建目录,对应的物理路径也一定要创建好
CREATE OR REPLACE DIRECTORY UTL_FILE_DIR AS '/u01/app/oracle/utl_file_dir';
--授予用户对目录的读写权限
GRANT READ, WRITE ON DIRECTORY UTL_FILE_DIR TO pfUser;
--UTL_FILE
GRANT EXECUTE ON utl_file TO pfUser;
2.将blob文件导出为文件
DECLARE
file_type UTL_FILE.FILE_TYPE;
blob_data BLOB;
BEGIN
select bytes_ into blob_data from ACT_GE_BYTEARRAY where iD_='205305222778722658';
file_type := utl_file.fopen('UTL_FILE_DIR', 'process.xml', 'W');
utl_file.PUT_RAW(file_type , blob_data, true);
UTL_FILE.FCLOSE(file_type);
END;
3.编辑修改文件后,再导入
DECLARE
B_FILE BFILE;
blob_data BLOB;
BEGIN
--return column into blob_data将该列与一个blog类型的变量绑定在一起,以后只要为blob_data赋值,即等于将该值插入了表中
INSERT INTO ACT_GE_BYTEARRAY
(ID_, REV_, NAME_, DEPLOYMENT_ID_, BYTES_, GENERATED_)
VALUES
('205305222778722658',
1,
'projectflow01.bpmn',
'205305222778722657',
EMPTY_BLOB(),
0)
RETURN BYTES_ INTO blob_data;
--将文件转换为bfile
B_FILE := BFILENAME('UTL_FILE_DIR', 'process.xml');
DBMS_LOB.OPEN(B_FILE, DBMS_LOB.FILE_READONLY);
-- 将b_file中的内容转换到blob_data
DBMS_LOB.LOADFROMFILE(blob_data, B_FILE, DBMS_LOB.GETLENGTH(B_FILE));
DBMS_LOB.CLOSE(B_FILE);
COMMIT;
END;
4.可能会遇到的问题
问题:Source of PACKAGE BODY SYS.UTL_FILE is not available
解决办法:
- select * from all_directories;
检查目录是否存在,对应的物理文件夹是否创建,是否正确授权 - 检查oralce用户对上述的物理文件夹是否有操作权限