运用UTL_FILE包进行文件的读写操作
读文件的操作如下
步骤1:在oracle数据库中创建文件目录
SQL>create or replace directory ORADIR_HY as '/home/qaadmin/';(如果登录的oracle用户没有创建目录的权限,则需要先授权
授权语句:Grant create any directory to mengxm;)
步骤2:目录创建以后,就可以把读写权限授予登录用户
SQL>GRANT WRITE,READ ON DIRECTORY ORADIR TO mengxm;
步骤3:授权给登录oracle的用户使用utl_file包的权限(可能当前登录的用户没有使用utl——file的权限)
SQL>GRANT EXECUTE ON utl_file TO sharedb;
步骤4:创建过程进行文件的读取
CREATE OR REPLACE PROCEDURE HY_1126 IS
ASTRLINE VARCHAR2(26494);
OUT_FILE UTL_FILE.FILE_TYPE;--定义一个文件类型
BEGIN
OUT_FILE := UTL_FILE.FOPEN('ORADIR_HY', 'hy.txt', 'R');--打开指定目录的文件。ORADIR_HY是文件所在的目录,hy.txt是要读取的文件,R文件写入的模式 W:写,文件不存在则创建,会覆盖 A:追加 R:读 注意:这里的ORADIR_HY需要用单引号引起来
LOOP
BEGIN
UTL_FILE.GET_LINE(OUT_FILE, ASTRLINE);--从OUT_FILE句柄中循环取得数据放入ASTRLINE变量中
DBMS_OUTPUT.PUT_LINE(ASTRLINE);--打印读出来的内容
EXCEPTION
WHEN OTHERS THEN
EXIT;
END;
END LOOP;
UTL_FILE.FCLOSE(OUT_FILE);
END;
/
编译完毕后,调用出现下面的错误
SQL> exec HY_1126;
begin HY_1126; end;
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at "CNLOG.HY_1126", line 5
ORA-06512: at line 1
解决办法:
原因1:可能是目录不存在。可尝试如下的操作进行检查
SQL> create or replace directory ORADIR_HY as '/home/qaadmin/';
Directory created.
SQL> host ls /home/qaadmin
/home/oracle/testdump not found
可以看到是目录不存在导致的,此时建立目录就OK
如果目录已经存在,还报如上的错误,那原因很可能就是没有设置utl_file包的可操作目录所致
原因2:没有设置utl_file的可操作目录。可设置utl_file的可操作目录后重新执行程序
SQL>alter system set utl_file_dir='/home/qaadmin/' scope=spfile;
SQL>exec HY_1126;
HELLO,I'M FROM FILE!
OK,成功了~
在过程中直接指定文件目录也是可以的。
将这句代码OUT_FILE := UTL_FILE.FOPEN('ORADIR_HY', 'hy.txt', 'R');
替换成
OUT_FILE := UTL_FILE.FOPEN('/home/qaadmin/, 'hy.txt', 'R');也是可以的。
------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------
写文件的操作如下
CREATE OR REPLACE PROCEDURE HY_1127 IS
OUT_FILE UTL_FILE.FILE_TYPE; --定义一个文件类型
BEGIN
OUT_FILE := UTL_FILE.FOPEN('ORADIR', 'hy.txt', 'W'); --打开指定目录的文件。ORADIR_HY是文件所在的目录,hy.txt是要写入的文件,R文件写入的模式 W:写,文件不存在则创建,会覆盖 A:追加 R:读 注意:这里的ORADIR_HY需要用单引号引起来
UTL_FILE.PUT_LINE(OUT_FILE, 'HELLO WORD!'); --将hello word 写入hy.txt文件
UTL_FILE.FFLUSH(OUT_FILE);
UTL_FILE.FCLOSE(OUT_FILE); --关闭文件流
--异常处理
END;
/