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_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详解的更多相关文章
- sqlldr详解
Oracle 的SQL*LOADER可以将外部数据加载到数据库表中.下面是SQL*LOADER的基本特点: 1)能装入不同数据类型文件及多个数据文件的数据2)可装入固定格式,自由定界以及可度长格式的数 ...
- Oracle 10g Data Pump Expdp/Impdp 详解
Data Pump 介绍 在第一部分看了2段官网的说明, 可以看出数据泵的工作流程如下: (1)在命令行执行命令 (2)expdp/impd 命令调用DBMS_DATAPUMP PL/SQL包. 这个 ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- Git初探--笔记整理和Git命令详解
几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...
随机推荐
- java 静态方法和实例方法的区别
转自 java 静态方法和实例方法的区别 静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法 ...
- f2fs解析(八)node 管理器中的node_info
free_info 功成身退,node_info顺利接班. // 这里还是蛮复杂的一件事,如果不搞清除的话,这个历史性的接班工作我们就接不上 上面说到 alloc_nid 和 alloc_nid_do ...
- 关于js中onclick字符串传参问题
规则: 外变是“”,里面就是‘’外边是‘’,里边就是“” 示例: var a="111"; var html="<a onclick='selecthoods( ...
- Win2008R2配置WebDeploy
一.配置服务器 1.安装管理服务 2.点击管理服务进行配置 3.安装WebDeploy 3.1通过离线安装包方式安装: https://www.iis.net/downloads/microsoft/ ...
- 携手K2 BPM,华住酒店完美实现“互联网+”转型
华住酒店集团,旗下6大品牌酒店,包括商旅品牌—禧玥酒店.全季酒店.星程酒店.汉庭酒店.海友酒店,以及度假品牌—漫心度假酒店.高端大气上档次一气呵成,2013年签约K2,携手成就美好生活. 演讲人:宋洪 ...
- JS调试加断点
js在回调函数执行时直接就跳过了,想看下回调函数也看不了,调试的debug代码一时半会儿想不起来,找了几分钟找到了,还是记一下好. 1 debugger;
- HTTP协议简介2
几个相关的知识点: 客户端发送请求时,请求类型为GET与POST的主要差别是什么? 1.请求类型不同,一个为GET,一个为POST 2.当请求类型为GET时,请求的数据以参数的形式添加到url的后面, ...
- Android EventBus源码解析 带你深入理解EventBus
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40920453,本文出自:[张鸿洋的博客] 上一篇带大家初步了解了EventBus ...
- [git]图解git常用命令
本文图解git中最常用的命令.如果你稍微理解git的工作原理,这篇文章能够让你理解的更透彻. 基本用法 约定 命令详解 Diff Commit Checkout Detached HEAD(匿名分支提 ...
- [CareerCup] 2.7 Palindrome Linked List 回文链表
2.7 Implement a function to check if a linked list is a palindrome. LeetCode上的原题,参见我之前的博客Palindrome ...