尝试使用utl_file方法读取文件

时间:2014-08-20 21:39:32

标签: sql oracle plsql utl-file

我正在尝试查看此文件是否存在。但我收到此错误消息。我已经检查了我得到的特权。但是这个文件在服务器端,所以我缺少一些东西

DECLARE
  vInHandle  utl_file.file_type;

BEGIN

  vInHandle := utl_file.fopen('IMG_UTL_DIR', 'image-file.csv', 'R');

  IF utl_file.is_open(vInHandle) THEN

      dbms_output.put_line('The File exists');

  Else

      dbms_output.put_line('The File not  exists');
  END IF;
END fopen;

错误:

  

ORA-29283:文件操作无效
  ORA-06512:在“SYS.UTL_FILE”,第536行   ORA-29283:文件操作无效
  ORA-06512:第5行

1 个答案:

答案 0 :(得分:2)

如果文件不存在,那么您将收到该错误。使用您的代码,当文件存在时,您将获得:

anonymous block completed
The File exists

但是当文件不存在时,你会得到:

Error report -
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 6
29283. 00000 -  "invalid file operation"
*Cause:    An attempt was made to read from a file or directory that does
           not exist, or file or directory access was denied by the
           operating system.
*Action:   Verify file and directory access privileges on the file system,
           and if reading, verify that the file exists.

请注意错误说明中的“不存在的文件或目录”。您不能像这样测试文件的存在。据我所知,没有直接的方法来测试存在的文件;您将不得不尝试打开该文件并捕获异常。例如:

DECLARE
  vInHandle  utl_file.file_type;
  eNoFile    exception;
  PRAGMA exception_init(eNoFile, -29283);
BEGIN
  BEGIN
    vInHandle := utl_file.fopen('IMG_UTL_DIR', 'image-file.csv', 'R');
    dbms_output.put_line('The File exists');
  EXCEPTION
    WHEN eNoFile THEN
      dbms_output.put_line('The File not  exists');
  END;
END fopen;
/

anonymous block completed
The File not  exists

但ORA-29283例外也可能意味着其他事情,正如描述所说,所以它并不一定意味着文件不在那里 - 它可能存在但不能用于其他一些(与许可相关)的原因。您还将在某种程度上屏蔽实际错误的位置,如果您在块中有多个文件操作,那么您必须将每个文件操作包装在其自己的begin / exception / end子块中以指定错误,或者失去实际的错误点。

你可能最好只是自然地引发​​和报告异常,而不是捕获它并将其替换为dbms_output消息,无论如何客户端都可能无法检索和显示该消息。