UTL_FILE详解
生活随笔
收集整理的這篇文章主要介紹了
UTL_FILE详解
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
包UTL_FILE 提供了在操作系統(tǒng)層面上對文件系統(tǒng)中文件的讀寫功能。非超級用戶在使用包UTL_FILE中任何函數(shù)或存儲(chǔ)過程前必須由超級用戶授予在這個(gè)包上的EXECUTE權(quán)限。例如:我們使用下列命令對用戶mary進(jìn)行授權(quán):GRANT EXECUTE ON PACKAGE SYS.UTL_FILE TO mary;
如果使用包UTL_FILE中的函數(shù)和存儲(chǔ)過程訪問文件,那么操作系統(tǒng)中的用戶enterprisedb必須在要訪問的目錄和文件上有相應(yīng)的讀寫權(quán)限。如果沒有相應(yīng)權(quán)限的話,在執(zhí)行包UTL_FILE中函數(shù)或存儲(chǔ)過程的時(shí)候,就會(huì)產(chǎn)生異常。在引用文件的時(shí)候,要使用到一個(gè)文件句柄,來表示對文件的讀或?qū)憽N募浔峭ㄟ^包 UTL_FILE中名稱為UTL_FILE.FILE_TYPE的公有變量來定義的。我們必須聲明一個(gè)類型為FILE_TYPE的變量來接收通過函數(shù) FOPEN返回的文件句柄。這個(gè)文件句柄將用于隨后在文件上的所有操作。對于文件系統(tǒng)上目錄的引用是通過使用目錄名稱,或者由CREATE DIRECTORY命令為目錄分配的化名來實(shí)現(xiàn)的。下面的表中列出了包UTL_FILE中允許使用的存儲(chǔ)過程和函數(shù)。表 7-44 在包UTL_FILE中允許使用的函數(shù)/存儲(chǔ)過程函數(shù)/存儲(chǔ)過程返回類型描述FCLOSE(file IN OUT)n/a關(guān)閉由參數(shù)file所指定的文件。FCLOSE_ALLn/a關(guān)閉所有打開的文件。FCOPY(location, filename, dest_dir, dest_file [, start_line [, end_line ] ])n/a將指定目錄location中文件filename代拷貝到目錄dest_dir中的文件dest_file,要拷貝的文件內(nèi)容范圍是從參數(shù)start_line開始,到end_line結(jié)束。FFLUSH(file)n/a強(qiáng)制將緩沖區(qū)中的數(shù)據(jù)寫到由參數(shù)file標(biāo)識的磁盤文件上。FOPEN(location, filename, open_mode [, max_linesize ])FILE_TYPE打開目錄location下,文件名為filename的文件。FREMOVE(location, filename)n/a從文件系統(tǒng)中刪除指定的文件。FRENAME(location, filename, dest_dir, dest_file [, overwrite ])n/a更改指定文件的名稱。GET_LINE(file, buffer OUT)n/a從參數(shù)file指定的文件中把一行文本讀到變量,緩沖區(qū)中。IS_OPEN(file)BOOLEAN確定指定文件是否已經(jīng)打開。NEW_LINE(file [, lines ])n/a將行結(jié)束符寫到文件中。PUT(file, buffer)n/a將緩沖區(qū)buffer的內(nèi)容寫到指定文件中。存儲(chǔ)過程PUT不寫入行結(jié)束符。PUT_LINE(file, buffer)n/a將緩沖區(qū)buffer的內(nèi)容寫到指定文件中,存儲(chǔ)過程PUTL_LINE會(huì)在文件中寫入行結(jié)束符。PUTF(file, format [, arg1 ] [, ...])n/a將格式化的字符串寫入指定文件中。我們可以最多可以指定5個(gè)可替代參數(shù)(從arg1到arg5)在參數(shù)format進(jìn)行替換。7.4.1 FCLOSE
存儲(chǔ)過程FCLOSE關(guān)閉一個(gè)已打開的文件。FCLOSE(fileIN OUT FILE_TYPE)
參數(shù)file一個(gè)類型為FILE_TYPE的變量,包含一個(gè)要被關(guān)閉的文件的句柄。7.4.2 FCLOSE_ALL
存儲(chǔ)過程FCLOSE_ALL關(guān)閉所有已打開的文件。如果沒有需要關(guān)閉的文件,存儲(chǔ)過程也會(huì)執(zhí)行成功。FCLOSE_ALL
7.4.3 FCOPY
存儲(chǔ)過程FCOPY把一個(gè)文件中文本拷貝到另外一個(gè)文件中。FCOPY(locationVARCHAR2, filenameVARCHAR2,dest_dirVARCHAR2, dest_fileVARCHAR2[, start_linePLS_INTEGER [, end_linePLS_INTEGER ] ])
參數(shù)location表示目錄名稱,存放在pg_catalog.edb_dir.dirname中,這個(gè)目錄包含要拷貝的文件。filename要拷貝文件的名稱。dest_dir表示目錄名稱,存放在pg_catalog.edb_dir.dirname中,是源文件要拷貝到目的目錄。dest_file目標(biāo)文件的名稱。start_line源文件中文本行號,用于指定開始拷貝的位置。缺省值是1。end_line源文件中最后一行要拷貝文本的行號。如果省略這個(gè)參數(shù)或者這個(gè)參數(shù)為空,那么就一直拷貝到文件中最后一行。示例下面的示例中產(chǎn)生文件 c:/temp/empdir/empfile.csv的拷貝。這個(gè)文件中包含一個(gè)逗號分隔的列表,內(nèi)容是表emp中的雇員信息。然后列出了empcopy.csv的內(nèi)容。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
存儲(chǔ)過程FFLUSH強(qiáng)制將緩沖區(qū)中未寫入磁盤的內(nèi)容寫到磁盤文件中,并將緩沖區(qū)的內(nèi)容清空。FFLUSH(fileFILE_TYPE)
參數(shù)file包含一個(gè)文件句柄的變量,類型為FILE_TYPE。示例調(diào)用存儲(chǔ)過程N(yùn)EW_LINE后,將緩沖區(qū)中的每一行記錄強(qiáng)制寫到磁盤中。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
函數(shù)FOPEN為I/O操作打開一個(gè)文件。filetypeFILE_TYPE FOPEN(locationVARCHAR2, filenameVARCHAR2,open_modeVARCHAR2 [, max_linesizeBINARY_INTEGER ])
參數(shù)location目錄名稱,存在pg_catalog.edb_dir.dirname中。這個(gè)目錄包含著要打開的文件。filename被打開文件的名稱。open_mode打開文件需要的模式。可允許的模式包括: a-向文件添加內(nèi)容;r-從文件讀取內(nèi)容;w - 向文件寫內(nèi)容。max_linesize一行文本的最大長度,以字符為單位。在讀模式中,如果試圖讀取一行長度超過max_linesize的值,那么會(huì)產(chǎn)生異常。在寫模式和附加模式中, 如果嘗試寫一行長度超過max_linesize的文本,那么也會(huì)產(chǎn)生異常。當(dāng)計(jì)算文本行是否超出最大行長度時(shí),不包含行結(jié)束符。這種系統(tǒng)行為與 Oracle不兼容。-Oracle在做相同操作時(shí)是計(jì)算行結(jié)束符的。filetype類型為FILE_TYPE的變量,包含被打開文件句柄。7.4.6 FREMOVE
存儲(chǔ)過程FREMOVE用于從系統(tǒng)中刪除一個(gè)文件。FREMOVE(locationVARCHAR2, filenameVARCHAR2)
如果要?jiǎng)h除的文件不存在,那么會(huì)產(chǎn)生一個(gè)異常。參數(shù)location目錄名稱,存放在pg_catalog.edb_dir.dirname中,這個(gè)目錄包含要?jiǎng)h除的文件。filename要?jiǎng)h除文件的名稱。示例下面的示例刪除了文件 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
存儲(chǔ)過程FRENAME修改一個(gè)文件的名稱,這樣我們可以把一個(gè)文件從一個(gè)位置移動(dòng)到另外一個(gè)位置。FRENAME(locationVARCHAR2, filenameVARCHAR2,dest_dirVARCHAR2, dest_fileVARCHAR2, [ overwriteBOOLEAN ])
參數(shù)location目錄名稱,存放在pg_catalog.edb_dir.dirname中,這個(gè)目錄包含要改名的文件。filename要改名的源文件名稱。dest_dir目錄名稱,存放在pg_catalog.edb_dir.dirname中,這個(gè)目錄是被改名文件所在的目錄。dest_file原始文件的新名稱。overwrite如果設(shè)置為”true”,在dest_dir 目錄中覆蓋任何名為dest_file 的文件。若設(shè)置為”false”,就會(huì)產(chǎn)生異常。這是缺省情況。示例下面我們將文件C:/TEMP/EMPDIR/empfile.csv重新命名,這個(gè)文件包含一個(gè)逗號分隔的列表,內(nèi)容是表emp中雇員的信息。然后列出重新命名后的文件 C:/TEMP/NEWDIR/newemp.csv的內(nèi)容。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
存儲(chǔ)過程GET_LINE從一個(gè)指定文件中讀取一行不包含行結(jié)束符的文本。如果在文件中已經(jīng)沒有文本行可供讀取的話,那么會(huì)產(chǎn)生名為NO_DATA_FOUND的異常。GET_LINE(fileFILE_TYPE, bufferOUT VARCHAR2)
參數(shù)file類型為FILE_TYPE的變量,包含已打開文件句柄的變量。buffer用于接收文件中文本行的變量。示例下面這個(gè)匿名代碼塊,讀取并顯示了文件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
函數(shù)IS_OPEN用來確認(rèn)指定文件是否已打開。statusBOOLEAN IS_OPEN(fileFILE_TYPE)
參數(shù)file類型為FILE_TYPE的變量,包含被測試文件的句柄。status如果指定文件已打開,那么返回”true”,否則返回”false”。7.4.10 NEW_LINE
向一個(gè)包含雙倍行距的雇員記錄列表寫入行結(jié)束符。NEW_LINE(fileFILE_TYPE [, linesINTEGER ])
參數(shù)file類型為FILE_TYPE的變量,包含要寫入行結(jié)束符的文件句柄。lines要寫入的行結(jié)束符的數(shù)量。缺省是1。示例向一個(gè)包含雙倍行距的雇員記錄列表寫入行結(jié)束符。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
然后顯示這個(gè)文件的內(nèi)容: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
存儲(chǔ)過程PUT將一行字符串寫入一個(gè)文件中。在字符串結(jié)尾的行結(jié)束符不會(huì)寫入到文件中。我們可以使用存儲(chǔ)過程N(yùn)EW_LINE在文件中增加行結(jié)束符。PUT(fileFILE_TYPE, buffer{ DATE | NUMBER | TIMESTAMP |VARCHAR2 })
參數(shù)file類型為FILE_TYPE的變量,包含一個(gè)文件句柄,字符串將寫到這個(gè)文件中。buffer要寫入指定文件中的文本。示例下面的示例使用存儲(chǔ)過程PUT創(chuàng)建了一個(gè)逗號分隔的列表,列表的內(nèi)容是表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
下面是上面創(chuàng)建文件empfile.csv的內(nèi)容: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
存儲(chǔ)過程PUT_LINE 向指定文件寫入一行包含行結(jié)束符的文本。PUT_LINE(fileFILE_TYPE, buffer{ DATE | NUMBER | TIMESTAMP |VARCHAR2 })
參數(shù)file類型為FILE_TYPE的變量,包含一個(gè)文件的句柄。文本記錄將寫到這個(gè)文件中。buffer要寫入指定文件中的文本。示例在下面的示例中,使用存儲(chǔ)過程PUT_LINE創(chuàng)建了一個(gè)包含以逗號分隔列表的文件,內(nèi)容是表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;
下面就是上面創(chuàng)建的empfile.csv中內(nèi)容: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
存儲(chǔ)過程PUTF向文件寫入一個(gè)格式化的字符串。PUTF(fileFILE_TYPE, formatVARCHAR2 [, arg1VARCHAR2][, ...])
參數(shù)file類型為FILE_TYPE的變量,包含文件句柄。我們將把格式化的文本記錄寫到這個(gè)參數(shù)指向的文件。format用于寫入文件的文本字符串格式。可以使用參數(shù)arg替代指定的字符串序列%s。指定的字符串序列/n表示新的一行。然而,要注意的是在 Postgres Plus Advanced Server中,必須以2個(gè)連續(xù)的反斜線而不是一個(gè)-//n來指定換行符。這個(gè)特性與Oracle不兼容。arg1最多可以有5個(gè)參數(shù)arg1...arg5 來替代格式字符串中出現(xiàn)的每個(gè)%s.按照第一個(gè)arg用于替代第一個(gè)出現(xiàn)的%s,第二個(gè)arg用于替代第二個(gè)%s。。這樣的順序進(jìn)行替代。示例在下面的匿名代碼塊中產(chǎn)生了包含表emp中數(shù)據(jù)的格式化輸出。需要注意的是E文本語法和格式字符串中出現(xiàn)的雙反斜線不屬于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
下面就是上面所創(chuàng)建的文件empfile.csv的內(nèi)容: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
轉(zhuǎn)載于:https://www.cnblogs.com/xinxin1994/p/5485115.html
總結(jié)
以上是生活随笔為你收集整理的UTL_FILE详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java分词取词_中文自动分词技术
- 下一篇: live2d-widget 看板娘(改)