今天在工作中看到了乙個oracle的儲存過程,公司電腦突然不能遠端了,只好明天再放上來了。
這個方法是oracle提供的檔案操作包:utl_file 中的乙個方法,其作用是開啟乙個檔案。
utl_file.fopen(location in varchar2, filename in varchar2, open_mode in varchar2,max_linesize in binary_integer)
return file_type;
其中的location並不能簡單的指定為』d:/temp』等路徑,要建立乙個directory變數並賦給許可權(必須以dba身份登入):
create
orreplace directory d_output as
'd:/temp'
;grant
read
,write
on directory d_output to testdb;
grant
execute
on utl_file to testdb;
就可以在資料庫伺服器的相應路徑下建立該檔案了。
開啟檔案時注意以下幾點:
utl_file.is_open 用法
如果檔案控制代碼指定的檔案已開啟,返回true,否則false
function utl_file.is_open (
file
in utl_file.file_type)
return
boolean
;
utl_file只提供乙個方法去讀取資料:get_line
utl_file.get_line 用法
讀取指定檔案的一行到提供的快取。
procedure utl_file.get_line (
file
in utl_file.file_type, buffer out varchar2)
;
utl_file.put 用法
在當前行輸出資料
procedure utl_file.put (
file
in utl_file.file_type, buffer out varchar2)
;
utl_file.put輸出資料時不會附加行終止符。
utl_file.put會產生以下異常
utl_file.invalid_filehandle
utl_file.invalid_operation
utl_file.write_error
utl_file.new_line
在當前位置輸出新行或行終止符,必須使用new_line來結束當前行,或者使用put_line輸出帶有行終止符的完整行資料。
procedure utl_file.new_line (
file
in utl_file.file_type,
lines
innatural :=1)
;
如果要在utl_file.put後立刻換行,可以如下例所示:
procedure add_line (file_in in utl_file.file_type, line_in in varchar2)
isbegin
utl_file.put (file_in, line_in)
; utl_file.new_line (file_in)
;end
;
utl_file.put_line
輸出乙個字串以及乙個與系統有關的行終止符
procedure utl_file.put_line (
file
in utl_file.file_type, buffer in varchar2)
;
在呼叫utl_file.put_line前,必須先開啟檔案。
utl_file.put_line會產生以下異常
utl_file.invalid_filehandle
utl_file.invalid_operation
utl_file.write_error
利用utl_file.put_line從表emp讀取資料到檔案,如下例所示:
procedure emp2file
is fileid utl_file.file_type;
begin
fileid := utl_file.fopen (
'/tmp'
,'emp.dat'
,'w');
/* quick and dirty construction here! */
for emprec in
(select
*from emp)
loop
utl_file.put_line
(to_char (emprec.empno)
||','
|| emprec.ename ||
','||..
. to_char (emprec.deptno));
endloop;
utl_file.fclose (fileid)
;end
;
put_line相當於put後加上new_line;也相當於putf的格式串"%s/n"。
utl_file.putf
以乙個模版樣式輸出至多5個字串,類似c中的printf
procedure utl_file.putf
(file
in file_type
,format in varchar2
,arg1 in varchar2 default
null
,arg2 in varchar2 default
null
,arg3 in varchar2 default
null
,arg4 in varchar2 default
null
,arg5 in varchar2 default
null
);
utl_file.fflush
確保所有資料寫入檔案。
procedure utl_file.fflush (
file
in utl_file.file_type)
;
作業系統可能會快取資料來提高效能。因此可能呼叫put後,開啟檔案卻看不到寫入的資料。在關閉檔案前要讀取資料的話可以使用utl_file.fflush。
典型的使用方法包括分析執行進度和除錯紀錄。
utl_file.fflush會產生以下異常
utl_file.invalid_filehandle
utl_file.invalid_operation
utl_file.write_error
utl_file.fclose
關閉檔案
procedure utl_file.fclose (
file
inout file_type)
;
注意:file是乙個in out引數,因為在關閉檔案後會設定為null
當試圖關閉檔案時有快取資料未寫入檔案,會丟擲write_error異常
utl_file.fclose會產生以下異常
utl_file.invalid_filehandle
utl_file.write_error
utl_file.fclose_all
關閉所有已開啟的檔案
procedure utl_file.fclose_all;
在結束程式時要確保所有開啟的檔案已關閉,可使用fclose_all
也可以在exception使用,當異常退出時,檔案也會被關閉。
exception
when others
then
utl_file.fclose_all;..
. other clean up activities ...
end;
注意:當使用fclose_all關閉所有檔案時,檔案控制代碼並不會標記為null,使用is_open會返回true。但是,那些關閉的檔案不能執行讀寫操作(除非你再次開啟檔案)。
utl_file.fclose_all會產生以下異常
utl_file.write_error
Oracle儲存過程呼叫儲存過程
oracle儲存過程呼叫有返回結果集的儲存過程一般用光標的方式,宣告乙個游標,把結果集放到游標裡面,然後迴圈游標 declare newcs sys refcursor cs1 number cs2 number cstype table rowtype table列的個數和newcs返回的個數一樣...
ORACLE儲存過程
自定義函式開始 create or replace function fn wftemplateidget templatecategoryid number,organid number,templatemode number return number istemplateid number i...
Oracle 儲存過程
create or replace procedure p 有就替換,沒有就建立 iscursor c is select from emp for update begin for v emp in c loop if v emp.deptno 10 then update emp2 set sa...