以下操作記錄了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;