clob utl_file 匯出成TXT檔案

wmlm發表於2008-12-10

原來做過BLOB匯出成XML的過程,這次根據需要做了一個另一個例子,將資料庫中的CLOB欄位匯出成文字檔案。與BLOB類似,但稍有不同,一是定義的定位器使用CLOB,二是定義的中間變數不是RAW,是VARCHAR2,三是向檔案寫入是使用PUT而不是PUT RAW;

如果是AIX+ORACLE9206 可要小心點。需要重建UTL FILE包

[@more@]

create or replace procedure ww_dmp_ct_law(p_docid number) is
-- +----------------------------------------------------+
-- | OUTPUT FILE VARIABLES |
-- +----------------------------------------------------+
v_outdir VARCHAR2(2000) := 'MY_DIR';
v_out_filename VARCHAR2(500) := 'ww_ct_law_';
v_out_fileext VARCHAR2(4) := '.txt';
v_out_filename_full VARCHAR2(500);
v_file_handle UTL_FILE.FILE_TYPE;

-- +----------------------------------------------------+
-- | DYNAMIC SQL VARIABLES |
-- +----------------------------------------------------+
TYPE v_lob_cur_typ IS REF CURSOR;
v_lob_cur v_lob_cur_typ;
v_sql_string VARCHAR2(4000);

-- +----------------------------------------------------+
-- | CLOB WRITE VARIABLES |
-- +----------------------------------------------------+

v_clob_loc CLOB;
buf varchar2(4000);
amt BINARY_INTEGER := 1024;
pos INTEGER := 2147483647;
begin
/** 從ct_law表中 將法規內容匯出成TXT檔案 以DOC ID做為檔名 檔案放在MY_DIR目錄中
對應作業系統的目錄 /app/oracle/admin/gsweb/tmp
*/
v_sql_string := 'SELECT content from ct_law where doc_id= '||p_docid;
OPEN v_lob_cur FOR v_sql_string;
LOOP
FETCH v_lob_cur INTO v_clob_loc;
EXIT WHEN v_lob_cur%NOTFOUND;
v_out_filename_full := v_out_filename || '_' || p_docid || v_out_fileext;
v_file_handle := UTL_FILE.FOPEN(v_outdir, v_out_filename_full, 'w', 32760);
pos:= 1;
begin
LOOP
dbms_lob.read(v_clob_loc, amt, pos, buf);
-- process contents of buf
UTL_FILE.PUT(v_file_handle,buf);
UTL_FILE.FFLUSH(file => v_file_handle);
pos := pos + amt;
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND then
UTL_FILE.FCLOSE(v_file_handle);
end;
END LOOP;
CLOSE v_lob_cur;
end ww_dmp_ct_law;

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

相關文章