Oracle之UTL_FILE 包用法詳解

來源:互聯網
上載者:User

標籤:

UTL_FILE包可以用來讀寫作業系統上的文字檔,UTL_FILE提供了在用戶端(FORM等等)和伺服器端的檔案訪問功能。建立測試目錄:建立一個command window;建立目錄:(以system使用者登入資料庫)Sql代碼  收藏代碼SQL> create or replace directory cux_log_dir as ‘/home/appltest/debug‘;    Directory created  賦許可權。Sql代碼  收藏代碼SQL> grant read, write on directory cux_log_dir to public;    Grant succeeded   檢查目錄是否成功建立Sql代碼  收藏代碼select * FROM all_directories dir WHERE dir.DIRECTORY_NAME = ‘CUX_LOG_DIR‘;  Ps:視圖all_directories存放著我們能否訪問的目錄對象。如果要刪除目錄,也需用system使用者登入資料庫,執行如下命令:Drop directory cux_log_dir; 過程和函數:FOPEN描述:開啟一個檔案,基本上在我們對檔案進行讀寫動作之前都需要先執行這個function來開啟檔案先。文法:UTL_FILE.FOPEN (  location IN VARCHAR2,filename IN VARCHAR2,open_mode IN VARCHAR2,max_linesize IN BINARY_INTEGER DEFAULT 1024)  RETURN FILE_TYPE;參數:location   略。            Filename  略。            open_mode  指明檔案開啟的模式。有如下幾種:■r –唯讀(文本)■ w – 唯寫(本文)■ a – 追加(文本)■ rb – 唯讀(位元組)■ wb – 唯寫(位元組)■ ab – 追加(位元組)                     (註:當使用模式:a或者ab的時候,如果檔案不存在,則會以write模式建立此檔案)        max_linesize   指定檔案文本每一行存放的最大字元數。     傳回值:FOPEN返回一個接下來我們的程式將要使用到的檔案的指標 FCLOSE功能:關閉一個開啟的檔案。文法:UTL_FILE.FCLOSE (file IN OUT FILE_TYPE);參數:1. file->調用FOPEN或者FOPEN_NVCHAR返回的活動中的檔案指標。注意事項:當FCLOSE執行的時候,如果還有緩衝資料沒有及時寫入到檔案中,那麼程式就會raise一個異常:WRITE_ERROR。可以在PUT_LINE的時候加上參數autoflush => TRUE;或者在每次PUT之後執行:FFLUSH。 FCLOSE_ALL功能:此procedure將會關閉本次session所有開啟的檔案。它用來緊急情況的清理功能,例如當PL/SQL程式在EXCEPTION部分退出時。文法:UTL_FILE.FCLOSE_ALL;注意事項:FCLOSE_ALL不會修改所開啟的檔案的狀態,也就是說執行了FCLOSE_ALL後,再用IS_OPEN去檢測檔案,結果還是開啟狀態,但是之後,這些檔案任然是不能去read或者write的。而FCLOSE執行後,相關的檔案則完全關閉了,測試:結果為:結果為: FCOPY功能:此procedure複製一個檔案的連續部分內容或者全部內容到一個新建立的檔案。如果參數start_line和end_line省略的話,預設地會複製整個檔案。此操作會將源檔案以read模式開啟,將目標檔案以write模式開啟。文法:UTL_FILE.FCOPY ( src_location    IN VARCHAR2,src_filename  IN VARCHAR2,dest_location  IN VARCHAR2,dest_filename IN VARCHAR2,start_line         IN BINARY_INTEGER DEFAULT 1,end_line          IN BINARY_INTEGER DEFAULT NULL); 參數:src_location來源檔案的目錄名。取值來源是視圖ALL_DIRECTORIES的DIRECTORY_NAME;             src_filename  將要被複製的來源檔案             dest_location 被建立的目標檔案存放的目錄名。    dest_filename 從來源檔案建立的目標檔案。    start_line  要複製的內容起始行號,預設為1,表示從第一行開始複製。    end_line 要複製的內容的終止行號,預設NULL,表示檔案的末尾。 測試程式之前:測試代碼:測試程式之後:並且l001-copy.log檔案中的內容只有兩行: FFLUSH描述:FFLUSH強制將緩衝的資料寫入檔案。因為通常待寫入檔案的資料都是都在緩衝儲存位置。當有必要去read一個任然處於開啟狀態的檔案時,FFLUSH就起作用了,例如在偵錯工具中,可以將調試的訊息及時衝到檔案中,已便於我們馬上就能read這些內容。文法:UTL_FILE.FFLUSH (file IN FILE_TYPE);  FGETATTR描述:FGETATTR讀取磁碟上的檔案並返迴文件的屬性。文法:UTL_FILE.FGETATTR( location IN VARCHAR2,filename IN VARCHAR2,fexists OUT BOOLEAN,file_length OUT NUMBER,block_size OUT BINARY_INTEGER);   參數:location 此處略去X個字。      filename此處略去X個字。      fexists 返回的屬性1:檔案是否存在      file_length 返回的屬性2:檔案位元組長度,如果檔案不存在,則返回NULL。      block_size  檔案系統塊的位元組大小。 測試: Sql代碼  收藏代碼DECLARE    l_loc         all_directories.directory_name%TYPE := ‘CUX_LOG_DIR‘;    l_file        utl_file.file_type;    l_file_exsits BOOLEAN;    l_file_length NUMBER;    l_block_size  BINARY_INTEGER;    l_buffer      VARCHAR2(1024);  BEGIN    utl_file.fgetattr(location    => l_loc,                      filename    => ‘l001.log‘,                      fexists     => l_file_exsits,                      file_length => l_file_length,                      block_size  => l_block_size);      IF l_file_exsits THEN        l_file := utl_file.fopen(location  => l_loc,                             filename  => ‘l001.log‘,                             open_mode => ‘R‘);    dbms_output.put_line(‘file exsits‘);    dbms_output.put_line(‘file length:‘ || l_file_length);    dbms_output.put_line(‘block sieze :‘ || l_block_size);  END IF;  utl_file.fclose_all;    END;    輸出結果: file exsitsfile length:39802block sieze :4096  FGETPOS描述:此函數返回一個檔案中當前的位移位置。文法:UTL_FILE.FGETPOS (file IN FILE_TYPE) RETURN PLS_INTEGER;   注意事項:如果file沒有開啟,則會拋出異常。測試:Sql代碼  收藏代碼DECLARE    l_loc    all_directories.directory_name%TYPE := ‘CUX_LOG_DIR‘;    l_file   utl_file.file_type;    l_buffer VARCHAR2(32767);  BEGIN    l_file := utl_file.fopen(location  => l_loc,                             filename  => ‘l001.log‘,                             open_mode => ‘R‘);    dbms_output.put_line(‘before get_line: current position is ‘ || utl_file.fgetpos(file => l_file));    utl_file.get_line(file   => l_file,                      buffer => l_buffer);    dbms_output.put_line(‘after  get_line: current position is ‘ || utl_file.fgetpos(file => l_file));    utl_file.fclose_all;    END;      結果:before get_line: current position is 0   after  get_line: current position is 3  FREMOVE描述:此procedure在你有充足的許可權之下,刪除一個磁碟上的檔案。文法:UTL_FILE.FREMOVE ( location IN VARCHAR2,      filename IN VARCHAR2); FRENAME描述:此procedure將一個存在的檔案重新命名,類似unix命令:mv文法:UTL_FILE.FRENAME ( src_location   IN VARCHAR2,     src_filename  IN VARCHAR2,     dest_location  IN VARCHAR2,     dest_filename IN VARCHAR2,     overwrite        IN BOOLEAN DEFAULT FALSE);參數:介紹略。 GET_LINE描述:此procedure從一個開啟的檔案中讀取一行文本,直到遇到分行符號。文法:UTL_FILE.GET_LINE ( file     IN FILE_TYPE,     buffer OUT VARCHAR2,     len      IN PLS_INTEGER DEFAULT NULL);   參數:len 從文本中讀取一次的長度,預設是null,oracle就取FOPEN時的max_linesieze。 IS_OPEN描述:顧名思義。文法:UTL_FILE.IS_OPEN (file IN FILE_TYPE)  RETURN BOOLEAN; PUT描述:PUT寫入內容到檔案中。(每寫一次,不帶分行符號)文法:UTL_FILE.PUT (file IN FILE_TYPE, buffer IN VARCHAR2); PUT_LINE描述:PUT_LINE寫入內容到檔案中。(每寫一次,末尾都加一個分行符號)文法:UTL_FILE.PUT_LINE ( file          IN FILE_TYPE,     buffer      IN VARCHAR2,              autoflush IN BOOLEAN DEFAULT FALSE); PUTF描述:    寫入格式化的內容到檔案中。好比C語言的printf()文法:UTL_FILE.PUTF ( file IN FILE_TYPE,     format IN VARCHAR2,     [arg1 IN VARCHAR2 DEFAULT NULL,      . . .              arg5 IN VARCHAR2 DEFAULT NULL]); 參數:format 包含格式化字元[\n,%s]的內容。   \n:代表一個分行符號。   %s:用arg1~5的值去代替。 完整例子程式:Sql代碼  收藏代碼    DECLARE        l_loc         all_directories.directory_name%TYPE := ‘CUX_LOG_DIR‘;        l_file        utl_file.file_type;        l_file_exsits BOOLEAN;        l_file_length NUMBER;        l_block_size  BINARY_INTEGER;        l_buffer      VARCHAR2(32767);                           --data        CURSOR c_hander IS          SELECT fu.user_name, fu.description            FROM fnd_user fu           WHERE 1 = 1             AND fu.user_name LIKE ‘XXX%‘           ORDER BY fu.user_name;             BEGIN        utl_file.fgetattr(location    => l_loc,                          filename    => ‘test.log‘,                          fexists     => l_file_exsits,                          file_length => l_file_length,                          block_size  => l_block_size);        --put        IF l_file_exsits THEN          l_file   := utl_file.fopen(location  => l_loc,                                     filename  => ‘test.log‘,                                     open_mode => ‘w‘);        l_buffer := ‘begining of file....‘;        utl_file.put_line(file   => l_file,                          buffer => l_buffer);        FOR l IN c_hander LOOP          l_buffer := l.user_name || chr(9) || nvl(l.description,                                                   ‘no description‘);          utl_file.put_line(file   => l_file,                            buffer => l_buffer);        END LOOP;        l_buffer := ‘end of file....‘;        utl_file.put_line(file   => l_file,                          buffer => l_buffer);              --flush        utl_file.fflush(file => l_file);              --get        l_file := utl_file.fopen(location  => l_loc,                                 filename  => ‘test.log‘,                                 open_mode => ‘r‘);              utl_file.fgetattr(location    => l_loc,                          filename    => ‘test.log‘,                          fexists     => l_file_exsits,                          file_length => l_file_length,                          block_size  => l_block_size);              LOOP          utl_file.get_line(file   => l_file,                            buffer => l_buffer,                            len    => 32767);          dbms_output.put_line(a => l_buffer);                  EXIT WHEN utl_file.fgetpos(file => l_file) = l_file_length;        END LOOP;            END IF;      utl_file.fclose_all;    END;   



詳細:http://zhangzhongjie.iteye.com/blog/1903024

 

 

Oracle之UTL_FILE 包用法詳解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.