將資料庫照片大欄位下卸到檔案系統,照片檔名以某一個欄位命名

abin1703發表於2020-04-29

目的:

將資料庫的照片匯入到檔案系統照片的名稱以grid主鍵資料命名照片名稱grid.jpg ,並指定照片的位置存放在資料庫中的位置



1、建立direcory存放照片位置

create directory BLOBDIR as '/expdp_dir1';

grant read ,write on directory to public;


2、在gr_xx 表新增一列存放照片地址

alter table grxer_xx11 add address varchar2(100);


3、建立儲存過程將資料庫照片匯出

create or replace procedure photo_dump(IDENTITYID in varchar2,filename in varchar2) is

l_file UTL_FILE.FILE_TYPE;

l_buffer RAW(32767);

l_amount BINARY_INTEGER := 32767;

l_pos INTEGER := 1;

l_blob BLOB;

l_blob_len INTEGER;

begin

SELECT photo

INTO l_blob

FROM grxer_xx11 WHERE grid = IDENTITYID and photo is not null;

l_blob_len := DBMS_LOB.GETLENGTH(l_blob);

l_file := UTL_FILE.FOPEN('BLOBDIR',filename,'wb', /*l_blob_len*/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 photo_dump;


4、執行匯出照片指令碼 並更新照片位置

declare

begin 

for i in (select grid  from grxer_xx11 where photo is not null) loop

photo_dump(i.grid,i.grid||'.jpg');

update  grxer_xx11 set address='/expdp_dir1/'||i.grid||'.jpg' where grid=i.grid;

commit;

end loop;

end;

/


如果圖片特別多需要進行分批處理,執行以下方案:

sqlplus bjsx/Tzxz0309 <<EOF

declare

begin 

for i in ( SELECT grid

  FROM ( SELECT ROWNUM AS rowno, t.grid

          FROM gr_xx t where photo is not null

           AND ROWNUM <= 1000000) table_alias

 WHERE table_alias.rowno >= 1) loop

photo_dump1(i.grid,i.grid||'.jpg');

commit;

end loop;

end;

/

EOF

標紅色為分頁寫法。


5、插看執行結果

cd /expdp_dir1/

ll *.jpg

select grid,address from grxer_xx11 where address is not null;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30345407/viewspace-2689254/,如需轉載,請註明出處,否則將追究法律責任。

相關文章