以下操作记录了blob字段的导出、导入方法流程。
方法原理:利用UTL_FILE将blob字段的内容以二进制的形式导出到txt文档,然后用dbms_blob将文档内容导入到指定的数据库表中。
1、 创建一个文本文档来保存blob数据。
这里在E盘home/dhl下创建一个名为text.txt的文件。
2、 创建oracle临时目录
1 create or replace directory UTL_FILE_DIR as 'E:/home/dhl/'; 2 GRANT read ,write ON DIRECTORY UTL_FILE_DIR TO PUBLIC;
注意: 目录下面要有text.txt的文件
3、 导出blob数据
这里以SVS.SVS_ACCADM_SEALINFO表这张数据表为例子,其中的SEAL就是BLOB类型的字段
1 DECLARE
2 file_handle UTL_FILE.FILE_TYPE;
3 b_lob BLOB;
4 BEGIN
5 select SEAL into b_lob from SVS.SVS_ACCADM_SEALINFO where ID='100007922';
6
7 file_handle := utl_file.fopen('UTL_FILE_DIR', 'test.txt', 'WB');
8 utl_file.put_raw(file_handle , b_lob, true);
9 UTL_FILE.FCLOSE(file_handle);
10 END;
执行完后,会把这条数据的BLOB类型的数据以二进制的形式写入到了text.txt的文件中。
4、 将文档内容导入到指定的数据库表中
1 DECLARE
2 b_file bfile;
3 b_lob BLOB;
4 BEGIN
5 --return a into b_lob将该列与一个blog类型的变量绑定在一起,以后只要为b_lob赋值,即等于将该值插入了表中
6 INSERT
7 INTO SVS.SVS_ACCADM_SEALINFO
8 (
9 ID,
10 SEAL,
11 SMALL_CODE,
12 SEAL_TYPE,
13 START_DATE,
14 END_DATE,
15 NO_USE_DATE,
16 MEMO,
17 SEAL_POSITION,
18 ACC_NO,
19 SEAL_CARD_ID,
20 SEAL_CARD_NO,
21 DOC_OBJECT_ID,
22 CRUD_FLAG
23 )
24 VALUES
25 (
26 '100007922',
27 EMPTY_BLOB(),
28 NULL,
29 'P',
30 '2019-11-26',
31 NULL,
32 NULL,
33 NULL,
34 NULL,
35 '2019112601',
36 '1199129990231314433',
37 '100003981',
38 'e19b7edfcdee436598367485605921cc57226621258',
39 '4'
40 )
41 RETURN SEAL
42 INTO b_lob;
43 --将文件转换为bfile
44 b_file := bfilename('UTL_FILE_DIR', 'test.txt');
45 dbms_lob.open(b_file, dbms_lob.file_readonly);
46 -- 将b_file中的内容转换到b_lob
47 dbms_lob.loadfromfile(b_lob,b_file,dbms_lob.getlength(b_file));
48 dbms_lob.close(b_file);
49 COMMIT;
50 END;
来源:https://www.cnblogs.com/wuxixin/p/11938933.html