oracle 导出数据 utl,【原创】利用utl_file包进行表数据导出
利用utl_file包進行表數據導出
2013/11/12
一、概述
工作中需要將許多表的數據導出到一份excel中,雖然PL/SQL自帶有導出的功能,但是導出后需要進行手動的匯總到一張excel中,比較耗時。此時就可以利用oracle自帶的utl_file包完成此工作。它可以將不同表的相關數據導出到一張excel里,省去了后續的工作。
------------------------------------------------------------------------------------
二、實驗步驟
1.導入utl_file包。
以sys用戶在command窗口執行如下SQL腳本即可。
utlfile.sql
2.建立文件導出目錄并賦予讀寫權限
create or replace directory data_out as 'd:\';
grant read ,write on directory data_out to scott;
3.對scott用戶賦予執行utl_file包的權限。
grant execute on utl_file to scott;
4.修改utl_file_dir參數,此參數為靜態參數,然后重啟數據庫。
alter system set utl_file_dir = 'd:\' scope = spfile;
5.創建存儲過程進行表數據導出
create or replace procedure
export_2_excel(pfile_name?in varchar2,
--輸出文件名
pexport_sql in varchar2) --執行的sql語句 ‘select
empno||chr(9),ename||chr(9) from emp’
--chr(9)是制表符。
as
--存儲記錄的對象類型
type content_record_type is record(
empno
varchar2(25),
ename
varchar2(25),
job?varchar2(25),
sal?varchar2(25));
content_re content_record_type;
--建立游標
type cur_content is ref cursor;
c_content cur_content;
l_file utl_file.file_type; --建立操作文件的句柄
begin
l_file := utl_file.fopen('d:\', pfile_name ||
'.xls', 'w'); --打開文件'
utl_file.put_line(l_file,
'empno' || chr(9) || 'ename' || chr(9) || 'job' ||
chr(9) || 'sal'); --輸出標頭
open c_content for pexport_sql; --打開游標
loop
fetch
c_content
into content_re.empno,
content_re.ename,
content_re.job,
content_re.sal;
exit when
c_content%notfound;
utl_file.put(l_file, content_re.empno);
utl_file.put(l_file, content_re.ename);
utl_file.put(l_file, content_re.job);
utl_file.put_line(l_file, content_re.sal);
end loop;
close c_content;
UTL_FILE.FFLUSH (l_file);--確保緩存已經寫入文件。
utl_file.fclose(l_file); --關閉句柄,一定不能忘!!!
end;
----------------------------------------------------------
附:utl_file包的介紹
utl_file包的應用是非常廣泛的,而且也很實用,應為Oracle雖然有SQL*Loader可以將文本的內容讀到數據庫里,?但是不能將數據庫內容輸出到文本。所以基本上是要用到utl_file包來操作。先看了一下Oracle官方文檔中的介紹,?utl_file推薦直接使用自己創建的DIRECTORY來操作文件,而不要繼續使用UTL_FILE_DIR包來指定。utl_file包的?工作機制是這樣的:首先要使用FOPEN函數,將文件的路徑、文件名、以及打開模式的參數傳入,然后Oracle會到?ALL_DIRECTORIES視圖中查看路徑是否已經創建。如果路徑和文件名均合法,則該文件被打開到一個file_type中,?然后可以進行各種操作,最后使用FCLOSE函數將其關閉。具體了解包可以查看utlfile.sql里面的內容,這里僅列舉?一下常用過程和函數。
FOPEN
,?IS_OPEN?,?GET_LINE?,?PUT?,?NEW_LINE?,
PUT_LINE?,?PUTF?,?FFLUSH?,?FCLOSE?,?FCLOSE_ALL 。
---------------------------------------------------------------
1.UTL_FILE.FOPEN
--FOPEN會打開指定文件并返回一個文件句柄用于操作文件。
FUNCTION UTL_FILE.FOPEN
(?location?IN VARCHAR2,?--輸出文件地址?filename?IN VARCHAR2,?--輸出文件名?open_mode?IN
VARCHAR2,?--打開文件的模式?max_linesize IN BINARY_INTEGER DEFAULT NULL
--文件每行最大的字符數,包括換行符。最小為1,最大為32767
)?RETURN
file_type;?3種文件打開模式:
R 只讀模式。一般配合UTL_FILE的GET_LINE來讀文件。
W 寫(替換)模式。文件的所有行會被刪除。PUT, PUT_LINE, NEW_LINE,
PUTF和FFLUSH都可使用。
A 寫(附加)模式。原文件的所有行會被保留。在最末尾行附加新行。PUT, PUT_LINE, NEW_LINE,
PUTF和FFLUSH都可使用。
2.UTL_FILE.IS_OPEN
--如果文件句柄指定的文件已打開,返回TRUE,否則FALSE
FUNCTION UTL_FILE.IS_OPEN (file IN UTL_FILE.FILE_TYPE--文件句柄
)
RETURN BOOLEAN;
3.UTL_FILE.GET_LINE
--UTL_FILE只提供一個方法去讀取數據:GET_LINE
讀取指定文件的一行到提供的緩存。
PROCEDURE
UTL_FILE.GET_LINE(file?IN?UTL_FILE.FILE_TYPE, --文件句柄
buffer OUT VARCHAR2,--存放緩存,行終止符不會被傳進buffer
len?IN BINARY_INTEGER DEFAULT NULL);
4.UTL_FILE.PUT
--在當前行輸出數據
--UTL_FILE.PUT輸出數據時不會附加行終止符。
PROCEDURE UTL_FILE.PUT(file?IN
UTL_FILE.FILE_TYPE, --文件句柄
buffer OUT VARCHAR2);--要寫入的數據緩存
5.UTL_FILE.NEW_LINE
--在當前位置輸出新行或行終止符,使用UTL_FILE.PUT必須使用NEW_LINE來結束當前行。
--但可以使用PUT_LINE輸出帶有行終止符的完整行數據。
PROCEDURE UTL_FILE.NEW_LINE(file IN UTL_FILE.FILE_TYPE,
--文件句柄
lines IN NATURAL := 1); --要插入的行數,默認為1行
6.UTL_FILE.PUT_LINE
--輸出一個字符串以及一個與系統有關的行終止符。
--PUT_LINE相當于PUT后加上NEW_LINE;也相當于PUTF的格式串"%s/n"。
PROCEDURE UTL_FILE.PUT_LINE
(file?IN UTL_FILE.FILE_TYPE,
--文件句柄
buffer IN VARCHAR2);--寫入文件的數據緩存
7.UTL_FILE.PUTF
以一個模版樣式輸出至多5個字符串,類似C中的printf
PROCEDURE UTL_FILE.PUTF(file?IN
FILE_TYPE,--文件句柄
format IN VARCHAR2,--格式串
arg1?IN VARCHAR2 DEFAULT
NULL,--可選參數,一共5個
arg2?IN VARCHAR2 DEFAULT NULL,
arg3?IN VARCHAR2 DEFAULT NULL,
arg4?IN
VARCHAR2 DEFAULT NULL,
arg5?IN
VARCHAR2 DEFAULT NULL);
格式串可使用以下樣式
%s
在格式串中可以使用最多5個%s,與后面的5個參數一一對應
/n
換行符。在格式串中沒有個數限制
%s會被后面的參數依次填充,如果沒有足夠的參數,%s會被忽視,不被寫入文件
8.UTL_FILE.FFLUSH
--確保所有數據寫入文件。
--操作系統可能會緩存數據來提高性能。因此可能調用put后,打開文件卻看不到寫入的數據。
--在關閉文件前要讀取數據的話可以使用UTL_FILE.FFLUSH。
PROCEDURE UTL_FILE.FFLUSH (file IN UTL_FILE.FILE_TYPE);
9.UTL_FILE.FCLOSE
--關閉文件
PROCEDURE UTL_FILE.FCLOSE (file IN OUT FILE_TYPE);
10.UTL_FILE.FCLOSE_ALL
--關閉所有已打開的文件
PROCEDURE UTL_FILE.FCLOSE_ALL;
在結束程序時要確保所有打開的文件已關閉,可使用FCLOSE_ALL。
總結
以上是生活随笔為你收集整理的oracle 导出数据 utl,【原创】利用utl_file包进行表数据导出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle tranc,ORACLE
- 下一篇: oracle服务器错误,oracle 1