oracle--导出、导入blob类型的字段
blob是oracle中的一个数据类型,保存的是压缩后的二进制形式的大数据。
数据迁移如果涉及到blob字段,都不好处理,因为无法用常规方法进行操作,如:使用select查看该字段,也无法用insert插入该字段的值。
以下记录了blob字段的导出、导入方法流程。
方法原理:利用UTL_FILE将blob字段的内容以二进制的形式导出到txt文档,然后用dbms_blob将文档内容导入到指定的数据库表中
1、创建一个文本文档来保存blob数据
这里在home目录下创建了一个名为test.txt的文件,即/home/dhl/test.txt
2、创建oracle临时目录
create or replace directory UTL_FILE_DIR as '/home/dhl/';
3、导出blob数据
这里以SY_QRTZ_JOB_DETAILS这张数据表为例子,其中的JOB_DATA就是blob类型的字段
1 DECLARE2 file_handle UTL_FILE.FILE_TYPE;3 b_lob BLOB;4 BEGIN5 select JOB_DATA into b_lob from SY_QRTZ_JOB_DETAILS where JOB_NAME='2WNfkfZZ14YUodhnYOfEzbl';6 7 file_handle := utl_file.fopen('UTL_FILE_DIR', 'test.txt', 'W'); 8 utl_file.PUT_RAW(file_handle , b_lob, true); 9 UTL_FILE.FCLOSE(file_handle);
10 END;
4、将文档内容导入到指定的数据库表中
1 DECLARE2 b_file bfile;3 b_lob BLOB;4 BEGIN5 --return a into b_lob将该列与一个blog类型的变量绑定在一起,以后只要为b_lob赋值,即等于将该值插入了表中6 INSERT7 INTO SY_QRTZ_JOB_DETAILS8 (9 SCHED_NAME,
10 JOB_NAME,
11 JOB_GROUP,
12 DESCRIPTION,
13 JOB_CLASS_NAME,
14 IS_DURABLE,
15 IS_NONCONCURRENT,
16 IS_UPDATE_DATA,
17 REQUESTS_RECOVERY,
18 JOB_DATA
19 )
20 VALUES
21 (
22 'RhScheduler',
23 'test6',
24 'DEFAULT',
25 'test6',
26 'com.rh.core.icbc.imp.NImpStateJob',
27 '1',
28 '0',
29 '0',
30 '0',
31 empty_blob()
32 )
33 RETURN JOB_DATA
34 INTO b_lob;
35 --将文件转换为bfile
36 b_file := bfilename('UTL_FILE_DIR', 'test.txt');
37 dbms_lob.open(b_file, dbms_lob.file_readonly);
38 -- 将b_file中的内容转换到b_lob
39 dbms_lob.loadfromfile(b_lob,b_file,dbms_lob.getlength(b_file));
40 dbms_lob.close(b_file);
41 COMMIT;
42 END;