本文主要介紹 Oracle下 批量導入導出圖片的方法,存儲過程
Oracle LOB 類型介紹BLOB的含義BLOB (binary large object),二進制大對象,是一個可以存儲二進制文件的容器。 主要圖片、聲音文件等,保存位圖
CLOB的含義CLOB(Character Large Object),它與LONG數(shù)據(jù)類型類似,只不過CLOB用于存儲數(shù)據(jù)庫中的大型單字節(jié)字符數(shù)據(jù)塊,不支持寬度不等的字符集。可存儲的最大大小為4G字節(jié)
.CLOB使用CHAR來保存數(shù)據(jù)。 如:保存XML文檔。
批量導入導出批量導入--創(chuàng)建表,及目錄 create table image_lob(t_id varchar2(10) not null,name varchar2(30),t_image blob not null);
create or replace directory "images_dump" as '/home/oracle/images_dump/';
--創(chuàng)建存儲過程 create or replace procedure img_insert(tid varchar2,vname varchar2,filename varchar2) as f_lob bfile; b_lob blob; begin insert into image_lob(t_id,name,t_image) values(tid,vname,empty_blob()) return t_image into b_lob; f_lob:=bfilename('images_dump',filename); dbms_lob.fileopen(f_lob,dbms_lob.file_readonly); dbms_lob.loadfromfile(b_lob,f_lob,dbms_lob.getlength(f_lob)); dbms_lob.fileclose(f_lob); commit; end; /
--執(zhí)行導入 exec img_insert(89898989,'firsouler','dbwn.png'); exec img_insert(16211779,'abc','adr.png');
批量導出--創(chuàng)建導出目錄,注意權限 create or replace directory BLOBDIR as '/home/oracle/images_exp'; grant read,write on directory BLOBDIR to mytest;
--創(chuàng)建過程,本例使用t_id,name列作為照片名字,根據(jù)t_id 排序獲取rownum CREATE OR REPLACE PROCEDURE GET_PIC_BLOB(i_xh VARCHAR2) IS l_file UTL_FILE.FILE_TYPE; l_buffer RAW(32767); l_amount BINARY_INTEGER := 32767; l_pos INTEGER := 1; l_name VARCHAR2(30); l_id VARCHAR2(30); l_blob BLOB; l_blob_len INTEGER; BEGIN with tmp_image as (select rownum as rn,t_id,name,t_image from image_lob order by t_id) select t_id,name,t_image into l_id,l_name,l_blob from tmp_image where rn = i_xh; l_blob_len := DBMS_LOB.GETLENGTH(l_blob); l_file := UTL_FILE.FOPEN('BLOBDIR', l_id || '_' || l_name || '.jpg', 'WB', 32767); 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 OTHERS THEN dbms_output.put_line(SQLERRM); IF UTL_FILE.IS_OPEN(l_file) THEN UTL_FILE.FCLOSE(l_file); END IF; RAISE; END GET_PIC_BLOB; /
--循環(huán)導出200個圖片,以列t_id排序獲取rownum declare cursor cur is with t as (select rownum as rn from image_lob order by t_id) select rn from t where rownum <= 200; --導出前200張 begin for rec in cur loop GET_PIC_BLOB(rec.rn); end loop; end; /
|