0

このファイルが存在するかどうかを確認しようとしています。しかし、このエラーメッセージが表示されます。取得した権限は既に確認済みです。しかし、このファイルはサーバー側にあるので、何か不足していますか

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

4

1 に答える 1

3

ファイルが存在しない場合、そのエラーが発生します。あなたのコードでは、ファイルが存在する場合、次のようになります。

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おそらく、例外をキャッチして、クライアントによって取得および表示されない可能性のあるメッセージに置き換えるよりも、例外を自然に発生させて報告する方がよいでしょう。

于 2014-08-21T07:30:43.187 に答える