UTL_FILE详解
生活随笔
收集整理的這篇文章主要介紹了
UTL_FILE详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
包UTL_FILE 提供了在操作系統層面上對文件系統中文件的讀寫功能。非超級用戶在使用包UTL_FILE中任何函數或存儲過程前必須由超級用戶授予在這個包上的EXECUTE權限。例如:我們使用下列命令對用戶mary進行授權:GRANT EXECUTE ON PACKAGE SYS.UTL_FILE TO mary;
如果使用包UTL_FILE中的函數和存儲過程訪問文件,那么操作系統中的用戶enterprisedb必須在要訪問的目錄和文件上有相應的讀寫權限。如果沒有相應權限的話,在執行包UTL_FILE中函數或存儲過程的時候,就會產生異常。在引用文件的時候,要使用到一個文件句柄,來表示對文件的讀或寫。文件句柄是通過包 UTL_FILE中名稱為UTL_FILE.FILE_TYPE的公有變量來定義的。我們必須聲明一個類型為FILE_TYPE的變量來接收通過函數 FOPEN返回的文件句柄。這個文件句柄將用于隨后在文件上的所有操作。對于文件系統上目錄的引用是通過使用目錄名稱,或者由CREATE DIRECTORY命令為目錄分配的化名來實現的。下面的表中列出了包UTL_FILE中允許使用的存儲過程和函數。表 7-44 在包UTL_FILE中允許使用的函數/存儲過程函數/存儲過程返回類型描述FCLOSE(file IN OUT)n/a關閉由參數file所指定的文件。FCLOSE_ALLn/a關閉所有打開的文件。FCOPY(location, filename, dest_dir, dest_file [, start_line [, end_line ] ])n/a將指定目錄location中文件filename代拷貝到目錄dest_dir中的文件dest_file,要拷貝的文件內容范圍是從參數start_line開始,到end_line結束。FFLUSH(file)n/a強制將緩沖區中的數據寫到由參數file標識的磁盤文件上。FOPEN(location, filename, open_mode [, max_linesize ])FILE_TYPE打開目錄location下,文件名為filename的文件。FREMOVE(location, filename)n/a從文件系統中刪除指定的文件。FRENAME(location, filename, dest_dir, dest_file [, overwrite ])n/a更改指定文件的名稱。GET_LINE(file, buffer OUT)n/a從參數file指定的文件中把一行文本讀到變量,緩沖區中。IS_OPEN(file)BOOLEAN確定指定文件是否已經打開。NEW_LINE(file [, lines ])n/a將行結束符寫到文件中。PUT(file, buffer)n/a將緩沖區buffer的內容寫到指定文件中。存儲過程PUT不寫入行結束符。PUT_LINE(file, buffer)n/a將緩沖區buffer的內容寫到指定文件中,存儲過程PUTL_LINE會在文件中寫入行結束符。PUTF(file, format [, arg1 ] [, ...])n/a將格式化的字符串寫入指定文件中。我們可以最多可以指定5個可替代參數(從arg1到arg5)在參數format進行替換。7.4.1 FCLOSE
存儲過程FCLOSE關閉一個已打開的文件。FCLOSE(fileIN OUT FILE_TYPE)
參數file一個類型為FILE_TYPE的變量,包含一個要被關閉的文件的句柄。7.4.2 FCLOSE_ALL
存儲過程FCLOSE_ALL關閉所有已打開的文件。如果沒有需要關閉的文件,存儲過程也會執行成功。FCLOSE_ALL
7.4.3 FCOPY
存儲過程FCOPY把一個文件中文本拷貝到另外一個文件中。FCOPY(locationVARCHAR2, filenameVARCHAR2,dest_dirVARCHAR2, dest_fileVARCHAR2[, start_linePLS_INTEGER [, end_linePLS_INTEGER ] ])
參數location表示目錄名稱,存放在pg_catalog.edb_dir.dirname中,這個目錄包含要拷貝的文件。filename要拷貝文件的名稱。dest_dir表示目錄名稱,存放在pg_catalog.edb_dir.dirname中,是源文件要拷貝到目的目錄。dest_file目標文件的名稱。start_line源文件中文本行號,用于指定開始拷貝的位置。缺省值是1。end_line源文件中最后一行要拷貝文本的行號。如果省略這個參數或者這個參數為空,那么就一直拷貝到文件中最后一行。示例下面的示例中產生文件 c:/temp/empdir/empfile.csv的拷貝。這個文件中包含一個逗號分隔的列表,內容是表emp中的雇員信息。然后列出了empcopy.csv的內容。CREATE DIRECTORY empdir AS 'C:/TEMP/EMPDIR';DECLAREv_empfile UTL_FILE.FILE_TYPE;v_src_dir VARCHAR2(50) := 'empdir';v_src_file VARCHAR2(20) := 'empfile.csv';v_dest_dir VARCHAR2(50) := 'empdir';v_dest_file VARCHAR2(20) := 'empcopy.csv';v_emprec VARCHAR2(120);v_count INTEGER := 0;BEGINUTL_FILE.FCOPY(v_src_dir,v_src_file,v_dest_dir,v_dest_file);v_empfile := UTL_FILE.FOPEN(v_dest_dir,v_dest_file,'r');DBMS_OUTPUT.PUT_LINE('The following is the destination file, ''' ||v_dest_file || '''');LOOPUTL_FILE.GET_LINE(v_empfile,v_emprec);DBMS_OUTPUT.PUT_LINE(v_emprec);v_count := v_count + 1;END LOOP;EXCEPTIONWHEN NO_DATA_FOUND THENUTL_FILE.FCLOSE(v_empfile);DBMS_OUTPUT.PUT_LINE(v_count || ' records retrieved');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);END;The following is the destination file, 'empcopy.csv'7369,SMITH,CLERK,7902,17-DEC-80,800,,207499,ALLEN,SALESMAN,7698,20-FEB-81,1600,300,307521,WARD,SALESMAN,7698,22-FEB-81,1250,500,307566,JONES,MANAGER,7839,02-APR-81,2975,,207654,MARTIN,SALESMAN,7698,28-SEP-81,1250,1400,307698,BLAKE,MANAGER,7839,01-MAY-81,2850,,307782,CLARK,MANAGER,7839,09-JUN-81,2450,,107788,SCOTT,ANALYST,7566,19-APR-87,3000,,207839,KING,PRESIDENT,,17-NOV-81,5000,,107844,TURNER,SALESMAN,7698,08-SEP-81,1500,0,307876,ADAMS,CLERK,7788,23-MAY-87,1100,,207900,JAMES,CLERK,7698,03-DEC-81,950,,307902,FORD,ANALYST,7566,03-DEC-81,3000,,207934,MILLER,CLERK,7782,23-JAN-82,1300,,1014 records retrieved
7.4.4 FFLUSH
存儲過程FFLUSH強制將緩沖區中未寫入磁盤的內容寫到磁盤文件中,并將緩沖區的內容清空。FFLUSH(fileFILE_TYPE)
參數file包含一個文件句柄的變量,類型為FILE_TYPE。示例調用存儲過程NEW_LINE后,將緩沖區中的每一行記錄強制寫到磁盤中。DECLAREv_empfile UTL_FILE.FILE_TYPE;v_directory VARCHAR2(50) := 'empdir';v_filename VARCHAR2(20) := 'empfile.csv';CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;BEGINv_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');FOR i IN emp_cur LOOPUTL_FILE.PUT(v_empfile,i.empno);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.ename);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.job);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.mgr);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.hiredate);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.sal);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.comm);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.deptno);UTL_FILE.NEW_LINE(v_empfile);UTL_FILE.FFLUSH(v_empfile);END LOOP;DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);UTL_FILE.FCLOSE(v_empfile);END;
7.4.5 FOPEN
函數FOPEN為I/O操作打開一個文件。filetypeFILE_TYPE FOPEN(locationVARCHAR2, filenameVARCHAR2,open_modeVARCHAR2 [, max_linesizeBINARY_INTEGER ])
參數location目錄名稱,存在pg_catalog.edb_dir.dirname中。這個目錄包含著要打開的文件。filename被打開文件的名稱。open_mode打開文件需要的模式。可允許的模式包括: a-向文件添加內容;r-從文件讀取內容;w - 向文件寫內容。max_linesize一行文本的最大長度,以字符為單位。在讀模式中,如果試圖讀取一行長度超過max_linesize的值,那么會產生異常。在寫模式和附加模式中, 如果嘗試寫一行長度超過max_linesize的文本,那么也會產生異常。當計算文本行是否超出最大行長度時,不包含行結束符。這種系統行為與 Oracle不兼容。-Oracle在做相同操作時是計算行結束符的。filetype類型為FILE_TYPE的變量,包含被打開文件句柄。7.4.6 FREMOVE
存儲過程FREMOVE用于從系統中刪除一個文件。FREMOVE(locationVARCHAR2, filenameVARCHAR2)
如果要刪除的文件不存在,那么會產生一個異常。參數location目錄名稱,存放在pg_catalog.edb_dir.dirname中,這個目錄包含要刪除的文件。filename要刪除文件的名稱。示例下面的示例刪除了文件 empfile.csv :DECLAREv_directory VARCHAR2(50) := 'empdir';v_filename VARCHAR2(20) := 'empfile.csv';BEGINUTL_FILE.FREMOVE(v_directory,v_filename);DBMS_OUTPUT.PUT_LINE('Removed file: ' || v_filename);EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);END;Removed file: empfile.csv
7.4.7 FRENAME
存儲過程FRENAME修改一個文件的名稱,這樣我們可以把一個文件從一個位置移動到另外一個位置。FRENAME(locationVARCHAR2, filenameVARCHAR2,dest_dirVARCHAR2, dest_fileVARCHAR2, [ overwriteBOOLEAN ])
參數location目錄名稱,存放在pg_catalog.edb_dir.dirname中,這個目錄包含要改名的文件。filename要改名的源文件名稱。dest_dir目錄名稱,存放在pg_catalog.edb_dir.dirname中,這個目錄是被改名文件所在的目錄。dest_file原始文件的新名稱。overwrite如果設置為”true”,在dest_dir 目錄中覆蓋任何名為dest_file 的文件。若設置為”false”,就會產生異常。這是缺省情況。示例下面我們將文件C:/TEMP/EMPDIR/empfile.csv重新命名,這個文件包含一個逗號分隔的列表,內容是表emp中雇員的信息。然后列出重新命名后的文件 C:/TEMP/NEWDIR/newemp.csv的內容。CREATE DIRECTORY "newdir" AS 'C:/TEMP/NEWDIR';DECLAREv_empfile UTL_FILE.FILE_TYPE;v_src_dir VARCHAR2(50) := 'empdir';v_src_file VARCHAR2(20) := 'empfile.csv';v_dest_dir VARCHAR2(50) := 'newdir';v_dest_file VARCHAR2(50) := 'newemp.csv';v_replace BOOLEAN := FALSE;v_emprec VARCHAR2(120);v_count INTEGER := 0;BEGINUTL_FILE.FRENAME(v_src_dir,v_src_file,v_dest_dir,v_dest_file,v_replace);v_empfile := UTL_FILE.FOPEN(v_dest_dir,v_dest_file,'r');DBMS_OUTPUT.PUT_LINE('The following is the renamed file, ''' ||v_dest_file || '''');LOOPUTL_FILE.GET_LINE(v_empfile,v_emprec);DBMS_OUTPUT.PUT_LINE(v_emprec);v_count := v_count + 1;END LOOP;EXCEPTIONWHEN NO_DATA_FOUND THENUTL_FILE.FCLOSE(v_empfile);DBMS_OUTPUT.PUT_LINE(v_count || ' records retrieved');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);END;The following is the renamed file, 'newemp.csv'7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,207499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,307521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,307566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,207654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,307698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,307782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,107788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,207839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,107844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,307876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,207900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,307902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,207934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,1014 records retrieved
7.4.8 GET_LINE
存儲過程GET_LINE從一個指定文件中讀取一行不包含行結束符的文本。如果在文件中已經沒有文本行可供讀取的話,那么會產生名為NO_DATA_FOUND的異常。GET_LINE(fileFILE_TYPE, bufferOUT VARCHAR2)
參數file類型為FILE_TYPE的變量,包含已打開文件句柄的變量。buffer用于接收文件中文本行的變量。示例下面這個匿名代碼塊,讀取并顯示了文件empfile.csv中記錄。DECLAREv_empfile UTL_FILE.FILE_TYPE;v_directory VARCHAR2(50) := 'empdir';v_filename VARCHAR2(20) := 'empfile.csv';v_emprec VARCHAR2(120);v_count INTEGER := 0;BEGINv_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'r');LOOPUTL_FILE.GET_LINE(v_empfile,v_emprec);DBMS_OUTPUT.PUT_LINE(v_emprec);v_count := v_count + 1;END LOOP;EXCEPTIONWHEN NO_DATA_FOUND THENUTL_FILE.FCLOSE(v_empfile);DBMS_OUTPUT.PUT_LINE('End of file ' || v_filename || ' - ' ||v_count || ' records retrieved');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);END;7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,207499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,307521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,307566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,207654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,307698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,307782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,107788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,207839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,107844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,307876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,207900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,307902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,207934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10End of file empfile.csv - 14 records retrieved
7.4.9 IS_OPEN
函數IS_OPEN用來確認指定文件是否已打開。statusBOOLEAN IS_OPEN(fileFILE_TYPE)
參數file類型為FILE_TYPE的變量,包含被測試文件的句柄。status如果指定文件已打開,那么返回”true”,否則返回”false”。7.4.10 NEW_LINE
向一個包含雙倍行距的雇員記錄列表寫入行結束符。NEW_LINE(fileFILE_TYPE [, linesINTEGER ])
參數file類型為FILE_TYPE的變量,包含要寫入行結束符的文件句柄。lines要寫入的行結束符的數量。缺省是1。示例向一個包含雙倍行距的雇員記錄列表寫入行結束符。DECLAREv_empfile UTL_FILE.FILE_TYPE;v_directory VARCHAR2(50) := 'empdir';v_filename VARCHAR2(20) := 'empfile.csv';CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;BEGINv_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');FOR i IN emp_cur LOOPUTL_FILE.PUT(v_empfile,i.empno);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.ename);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.job);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.mgr);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.hiredate);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.sal);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.comm);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.deptno);UTL_FILE.NEW_LINE(v_empfile,2);END LOOP;DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);UTL_FILE.FCLOSE(v_empfile);END;Created file: empfile.csv
然后顯示這個文件的內容:C:/TEMP/EMPDIR>TYPE empfile.csv7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,207499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,307521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,307566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,207654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,307698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,307782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,107788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,207839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,107844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,307876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,207900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,307902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,207934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
7.4.11 PUT
存儲過程PUT將一行字符串寫入一個文件中。在字符串結尾的行結束符不會寫入到文件中。我們可以使用存儲過程NEW_LINE在文件中增加行結束符。PUT(fileFILE_TYPE, buffer{ DATE | NUMBER | TIMESTAMP |VARCHAR2 })
參數file類型為FILE_TYPE的變量,包含一個文件句柄,字符串將寫到這個文件中。buffer要寫入指定文件中的文本。示例下面的示例使用存儲過程PUT創建了一個逗號分隔的列表,列表的內容是表emp中的雇員信息。DECLAREv_empfile UTL_FILE.FILE_TYPE;v_directory VARCHAR2(50) := 'empdir';v_filename VARCHAR2(20) := 'empfile.csv';CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;BEGINv_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');FOR i IN emp_cur LOOPUTL_FILE.PUT(v_empfile,i.empno);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.ename);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.job);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.mgr);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.hiredate);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.sal);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.comm);UTL_FILE.PUT(v_empfile,',');UTL_FILE.PUT(v_empfile,i.deptno);UTL_FILE.NEW_LINE(v_empfile);END LOOP;DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);UTL_FILE.FCLOSE(v_empfile);END;Created file: empfile.csv
下面是上面創建文件empfile.csv的內容:C:/TEMP/EMPDIR>TYPE empfile.csv7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,207499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,307521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,307566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,207654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,307698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,307782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,107788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,207839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,107844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,307876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,207900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,307902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,207934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
7.4.12 PUT_LINE
存儲過程PUT_LINE 向指定文件寫入一行包含行結束符的文本。PUT_LINE(fileFILE_TYPE, buffer{ DATE | NUMBER | TIMESTAMP |VARCHAR2 })
參數file類型為FILE_TYPE的變量,包含一個文件的句柄。文本記錄將寫到這個文件中。buffer要寫入指定文件中的文本。示例在下面的示例中,使用存儲過程PUT_LINE創建了一個包含以逗號分隔列表的文件,內容是表emp中的雇員信息。DECLAREv_empfile UTL_FILE.FILE_TYPE;v_directory VARCHAR2(50) := 'empdir';v_filename VARCHAR2(20) := 'empfile.csv';v_emprec VARCHAR2(120);CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;BEGINv_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');FOR i IN emp_cur LOOPv_emprec := i.empno || ',' || i.ename || ',' || i.job || ',' ||NVL(LTRIM(TO_CHAR(i.mgr,'9999')),'') || ',' || i.hiredate ||',' || i.sal || ',' ||NVL(LTRIM(TO_CHAR(i.comm,'9990.99')),'') || ',' || i.deptno;UTL_FILE.PUT_LINE(v_empfile,v_emprec);END LOOP;DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);UTL_FILE.FCLOSE(v_empfile);END;
下面就是上面創建的empfile.csv中內容:C:/TEMP/EMPDIR>TYPE empfile.csv7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,207499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,307521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,307566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,207654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,307698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,307782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,107788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,207839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,107844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,307876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,207900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,307902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,207934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
7.4.13 PUTF
存儲過程PUTF向文件寫入一個格式化的字符串。PUTF(fileFILE_TYPE, formatVARCHAR2 [, arg1VARCHAR2][, ...])
參數file類型為FILE_TYPE的變量,包含文件句柄。我們將把格式化的文本記錄寫到這個參數指向的文件。format用于寫入文件的文本字符串格式??梢允褂脜礱rg替代指定的字符串序列%s。指定的字符串序列/n表示新的一行。然而,要注意的是在 Postgres Plus Advanced Server中,必須以2個連續的反斜線而不是一個-//n來指定換行符。這個特性與Oracle不兼容。arg1最多可以有5個參數arg1...arg5 來替代格式字符串中出現的每個%s.按照第一個arg用于替代第一個出現的%s,第二個arg用于替代第二個%s。。這樣的順序進行替代。示例在下面的匿名代碼塊中產生了包含表emp中數據的格式化輸出。需要注意的是E文本語法和格式字符串中出現的雙反斜線不屬于Oracle兼容特性。DECLAREv_empfile UTL_FILE.FILE_TYPE;v_directory VARCHAR2(50) := 'empdir';v_filename VARCHAR2(20) := 'empfile.csv';v_format VARCHAR2(200);CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;BEGINv_format := E'%s %s, %s//nSalary: $%s Commission: $%s//n//n';v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');FOR i IN emp_cur LOOPUTL_FILE.PUTF(v_empfile,v_format,i.empno,i.ename,i.job,i.sal,NVL(i.comm,0));END LOOP;DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);UTL_FILE.FCLOSE(v_empfile);EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);END;Created file: empfile.csv
下面就是上面所創建的文件empfile.csv的內容:C:/TEMP/EMPDIR>TYPE empfile.csv7369 SMITH, CLERKSalary: $800.00 Commission: $07499 ALLEN, SALESMANSalary: $1600.00 Commission: $300.007521 WARD, SALESMANSalary: $1250.00 Commission: $500.007566 JONES, MANAGERSalary: $2975.00 Commission: $07654 MARTIN, SALESMANSalary: $1250.00 Commission: $1400.007698 BLAKE, MANAGERSalary: $2850.00 Commission: $07782 CLARK, MANAGERSalary: $2450.00 Commission: $07788 SCOTT, ANALYSTSalary: $3000.00 Commission: $07839 KING, PRESIDENTSalary: $5000.00 Commission: $07844 TURNER, SALESMANSalary: $1500.00 Commission: $0.007876 ADAMS, CLERKSalary: $1100.00 Commission: $07900 JAMES, CLERKSalary: $950.00 Commission: $07902 FORD, ANALYSTSalary: $3000.00 Commission: $07934 MILLER, CLERKSalary: $1300.00 Commission: $0
轉載于:https://www.cnblogs.com/xinxin1994/p/5485115.html
總結
以上是生活随笔為你收集整理的UTL_FILE详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java分词取词_中文自动分词技术
- 下一篇: live2d-widget 看板娘(改)