ORACLE读写文件

运用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');也是可以的。

你可能感兴趣的:(ORACLE读写文件)