包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_ALL n/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(file IN OUT FILE_TYPE)
参数 file 一个类型为FILE_TYPE的变量,包含一个要被关闭的文件的句柄。 7.4.2 FCLOSE_ALL
存储过程FCLOSE_ALL关闭所有已打开的文件。如果没有需要关闭的文件,存储过程也会执行成功。 FCLOSE_ALL
7.4.3 FCOPY
存储过程FCOPY把一个文件中文本拷贝到另外一个文件中。 FCOPY(location VARCHAR2, filename VARCHAR2, dest_dir VARCHAR2, dest_file VARCHAR2 [, start_line PLS_INTEGER [, end_line PLS_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'; DECLARE v_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; BEGIN UTL_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 || ''''); LOOP UTL_FILE.GET_LINE(v_empfile,v_emprec); DBMS_OUTPUT.PUT_LINE(v_emprec); v_count := v_count + 1; END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN UTL_FILE.FCLOSE(v_empfile); DBMS_OUTPUT.PUT_LINE(v_count || ' records retrieved'); WHEN OTHERS THEN DBMS_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,,20 7499,ALLEN,SALESMAN,7698,20-FEB-81,1600,300,30 7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30 7566,JONES,MANAGER,7839,02-APR-81,2975,,20 7654,MARTIN,SALESMAN,7698,28-SEP-81,1250,1400,30 7698,BLAKE,MANAGER,7839,01-MAY-81,2850,,30 7782,CLARK,MANAGER,7839,09-JUN-81,2450,,10 7788,SCOTT,ANALYST,7566,19-APR-87,3000,,20 7839,KING,PRESIDENT,,17-NOV-81,5000,,10 7844,TURNER,SALESMAN,7698,08-SEP-81,1500,0,30 7876,ADAMS,CLERK,7788,23-MAY-87,1100,,20 7900,JAMES,CLERK,7698,03-DEC-81,950,,30 7902,FORD,ANALYST,7566,03-DEC-81,3000,,20 7934,MILLER,CLERK,7782,23-JAN-82,1300,,10 14 records retrieved
7.4.4 FFLUSH
存储过程FFLUSH强制将缓冲区中未写入磁盘的内容写到磁盘文件中,并将缓冲区的内容清空。 FFLUSH(file FILE_TYPE)
参数 file 包含一个文件句柄的变量,类型为FILE_TYPE。 示例 调用存储过程NEW_LINE后,将缓冲区中的每一行记录强制写到磁盘中。 DECLARE v_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; BEGIN v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w'); FOR i IN emp_cur LOOP UTL_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操作打开一个文件。 filetype FILE_TYPE FOPEN(location VARCHAR2, filename VARCHAR2, open_mode VARCHAR2 [, max_linesize BINARY_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(location VARCHAR2, filename VARCHAR2)
如果要删除的文件不存在,那么会产生一个异常。 参数 location 目录名称,存放在pg_catalog.edb_dir.dirname中,这个目录包含要删除的文件。 filename 要删除文件的名称。 示例 下面的示例删除了文件 empfile.csv : DECLARE v_directory VARCHAR2(50) := 'empdir'; v_filename VARCHAR2(20) := 'empfile.csv'; BEGIN UTL_FILE.FREMOVE(v_directory,v_filename); DBMS_OUTPUT.PUT_LINE('Removed file: ' || v_filename); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM); DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE); END; Removed file: empfile.csv
7.4.7 FRENAME
存储过程FRENAME修改一个文件的名称,这样我们可以把一个文件从一个位置移动到另外一个位置。 FRENAME(location VARCHAR2, filename VARCHAR2, dest_dir VARCHAR2, dest_file VARCHAR2, [ overwrite BOOLEAN ])
参数 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'; DECLARE v_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; BEGIN UTL_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 || ''''); LOOP UTL_FILE.GET_LINE(v_empfile,v_emprec); DBMS_OUTPUT.PUT_LINE(v_emprec); v_count := v_count + 1; END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN UTL_FILE.FCLOSE(v_empfile); DBMS_OUTPUT.PUT_LINE(v_count || ' records retrieved'); WHEN OTHERS THEN DBMS_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,,20 7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30 7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30 7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20 7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30 7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30 7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10 7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20 7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10 7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30 7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20 7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30 7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20 7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10 14 records retrieved
7.4.8 GET_LINE
存储过程GET_LINE从一个指定文件中读取一行不包含行结束符的文本。如果在文件中已经没有文本行可供读取的话,那么会产生名为NO_DATA_FOUND的异常。 GET_LINE(file FILE_TYPE, buffer OUT VARCHAR2)
参数 file 类型为FILE_TYPE的变量,包含已打开文件句柄的变量。 buffer 用于接收文件中文本行的变量。 示例 下面这个匿名代码块,读取并显示了文件empfile.csv中记录。 DECLARE v_empfile UTL_FILE.FILE_TYPE; v_directory VARCHAR2(50) := 'empdir'; v_filename VARCHAR2(20) := 'empfile.csv'; v_emprec VARCHAR2(120); v_count INTEGER := 0; BEGIN v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'r'); LOOP UTL_FILE.GET_LINE(v_empfile,v_emprec); DBMS_OUTPUT.PUT_LINE(v_emprec); v_count := v_count + 1; END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN UTL_FILE.FCLOSE(v_empfile); DBMS_OUTPUT.PUT_LINE('End of file ' || v_filename || ' - ' || v_count || ' records retrieved'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM); DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE); END; 7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20 7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30 7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30 7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20 7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30 7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30 7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10 7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20 7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10 7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30 7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20 7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30 7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20 7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10 End of file empfile.csv - 14 records retrieved
7.4.9 IS_OPEN
函数IS_OPEN用来确认指定文件是否已打开。 status BOOLEAN IS_OPEN(file FILE_TYPE)
参数 file 类型为FILE_TYPE的变量,包含被测试文件的句柄。 status 如果指定文件已打开,那么返回”true”,否则返回”false”。 7.4.10 NEW_LINE
向一个包含双倍行距的雇员记录列表写入行结束符。 NEW_LINE(file FILE_TYPE [, lines INTEGER ])
参数 file 类型为FILE_TYPE的变量,包含要写入行结束符的文件句柄。 lines 要写入的行结束符的数量。缺省是1。 示例 向一个包含双倍行距的雇员记录列表写入行结束符。 DECLARE v_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; BEGIN v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w'); FOR i IN emp_cur LOOP UTL_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.csv 7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20 7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30 7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30 7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20 7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30 7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30 7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10 7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20 7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10 7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30 7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20 7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30 7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20 7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
7.4.11 PUT
存储过程PUT将一行字符串写入一个文件中。在字符串结尾的行结束符不会写入到文件中。我们可以使用存储过程NEW_LINE在文件中增加行结束符。 PUT(file FILE_TYPE, buffer { DATE | NUMBER | TIMESTAMP | VARCHAR2 })
参数 file 类型为FILE_TYPE的变量,包含一个文件句柄,字符串将写到这个文件中。 buffer 要写入指定文件中的文本。 示例 下面的示例使用存储过程PUT创建了一个逗号分隔的列表,列表的内容是表emp中的雇员信息。 DECLARE v_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; BEGIN v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w'); FOR i IN emp_cur LOOP UTL_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.csv 7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20 7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30 7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30 7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20 7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30 7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30 7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10 7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20 7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10 7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30 7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20 7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30 7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20 7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
7.4.12 PUT_LINE
存储过程PUT_LINE 向指定文件写入一行包含行结束符的文本。 PUT_LINE(file FILE_TYPE, buffer { DATE | NUMBER | TIMESTAMP | VARCHAR2 })
参数 file 类型为FILE_TYPE的变量,包含一个文件的句柄。文本记录将写到这个文件中。 buffer 要写入指定文件中的文本。 示例 在下面的示例中,使用存储过程PUT_LINE创建了一个包含以逗号分隔列表的文件,内容是表emp中的雇员信息。 DECLARE v_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; BEGIN v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w'); FOR i IN emp_cur LOOP v_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.csv 7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20 7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30 7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30 7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20 7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30 7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30 7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10 7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20 7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10 7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30 7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20 7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30 7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20 7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
7.4.13 PUTF
存储过程PUTF向文件写入一个格式化的字符串。 PUTF(file FILE_TYPE, format VARCHAR2 [, arg1 VARCHAR2] [, ...])
参数 file 类型为FILE_TYPE的变量,包含文件句柄。我们将把格式化的文本记录写到这个参数指向的文件。 format 用于写入文件的文本字符串格式。可以使用参数arg替代指定的字符串序列%s。指定的字符串序列/n表示新的一行。然而,要注意的是在 Postgres Plus Advanced Server中,必须以2个连续的反斜线而不是一个-//n来指定换行符。这个特性与Oracle不兼容。 arg1 最多可以有5个参数arg1...arg5 来替代格式字符串中出现的每个%s.按照第一个arg用于替代第一个出现的%s,第二个arg用于替代第二个%s。。这样的顺序进行替代。 示例 在下面的匿名代码块中产生了包含表emp中数据的格式化输出。需要注意的是E文本语法和格式字符串中出现的双反斜线不属于Oracle兼容特性。 DECLARE v_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; BEGIN v_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 LOOP UTL_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); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM); DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE); END; Created file: empfile.csv
下面就是上面所创建的文件empfile.csv的内容: C:/TEMP/EMPDIR>TYPE empfile.csv 7369 SMITH, CLERK Salary: $800.00 Commission: $0 7499 ALLEN, SALESMAN Salary: $1600.00 Commission: $300.00 7521 WARD, SALESMAN Salary: $1250.00 Commission: $500.00 7566 JONES, MANAGER Salary: $2975.00 Commission: $0 7654 MARTIN, SALESMAN Salary: $1250.00 Commission: $1400.00 7698 BLAKE, MANAGER Salary: $2850.00 Commission: $0 7782 CLARK, MANAGER Salary: $2450.00 Commission: $0 7788 SCOTT, ANALYST Salary: $3000.00 Commission: $0 7839 KING, PRESIDENT Salary: $5000.00 Commission: $0 7844 TURNER, SALESMAN Salary: $1500.00 Commission: $0.00 7876 ADAMS, CLERK Salary: $1100.00 Commission: $0 7900 JAMES, CLERK Salary: $950.00 Commission: $0 7902 FORD, ANALYST Salary: $3000.00 Commission: $0 7934 MILLER, CLERK Salary: $1300.00 Commission: $0

  

UTL_FILE详解的更多相关文章

  1. sqlldr详解

    Oracle 的SQL*LOADER可以将外部数据加载到数据库表中.下面是SQL*LOADER的基本特点: 1)能装入不同数据类型文件及多个数据文件的数据2)可装入固定格式,自由定界以及可度长格式的数 ...

  2. Oracle 10g Data Pump Expdp/Impdp 详解

    Data Pump 介绍 在第一部分看了2段官网的说明, 可以看出数据泵的工作流程如下: (1)在命令行执行命令 (2)expdp/impd 命令调用DBMS_DATAPUMP PL/SQL包. 这个 ...

  3. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  4. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  5. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  6. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  7. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  8. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  9. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

随机推荐

  1. Params 方法参数

    params,ref,out 方法参数 示例 在下面的方法使用中 OpenWindow(params object[] args) 传递的参数args添加了params修饰 public void O ...

  2. Windows环境中Openfire与Spark安装与配置指南

    安装软件: openfire3.9.3 spark2.6.3 安装环境: WindowsXP JDK1.6.0_21 Oracle 一.openfire安装 1.安装openfire3.9.3,下载地 ...

  3. velocity .vm

    关于.vm 后缀的文件,是velocity的文件.velocity是基于java的一种页面模板引擎,支持#if #else #foreach等写法的前台文件.$link.contextPath是该引擎 ...

  4. Toolbar的使用

    项目来源: https://github.com/xuwj/ToolbarDemo#userconsent# 一.V7包升级问题 折腾好久,终于解决 <style name="AppT ...

  5. pandas 前后行操作

    一.前后行满足条件 问题: 各位老师好,我有一个dataframe 产品 数据1 数据2 A 1 2 B 4 5 C 6 3 我想找出比如这一行数据1>数据2 AND 数据1的上一行3 AND ...

  6. Qt——QLineEdit使用总结

    QLineEdit是一个单行文本编辑控件. 使用者可以通过很多函数,输入和编辑单行文本,比如撤销.恢复.剪切.粘贴以及拖放等. 通过改变QLineEdit的 echoMode() ,可以设置其属性,比 ...

  7. Uedit的快捷键

    Key1 自动换行_CTRL + W     这个已经不是什么新奇的功能了,就连你们最不喜欢的notepad都有了这个功能.说来也奇怪,编辑器为什么都带有这个功能呢?谁愿意自己的编辑器带有水平滚动条啊 ...

  8. Sea.js & Require.js

    Sea.js 追求简单.自然的代码书写和组织方式,具有以下核心特性: 简单友好的模块定义规范:Sea.js 遵循 CMD 规范,可以像 Node.js 一般书写模块代码. 自然直观的代码组织方式:依赖 ...

  9. AutoMapper用法(转载)

    申明 本文转载自http://www.qeefee.com/article/automapper 作者:齐飞 配置AutoMapper映射规则 AutoMapper是基于约定的,因此在实用映射之前,我 ...

  10. Angularjs 异步模块加载项目模板

    ng-lazy-module-seed(Angularjs 异步模块加载项目模板) 相信做过SPA项目的朋友都遇到过这个问题:页面初始化时需要加载文件太大或太多了,许多文件加载后很可能不会运行到,这是 ...