2

こんにちは、私は Oracle 11 を実行しており、UTL_FILE.FOPEN を使用してサーバー ボックスのディレクトリに書き込もうとしています。

これをテストするために、次のスクリプトを使用しています (出力が含まれています)。

SQL> @D:\test.sql

declare

l_file_handle              UTL_FILE.FILE_TYPE;

begin
  l_file_handle := UTL_FILE.FOPEN('/appl/mydir',
                                  '/appl/mydir/filename',
                                  'W');

  UTL_FILE.FCLOSE(l_file_handle);

  DBMS_OUTPUT.PUT_LINE('FINISHED');

end;

ORA-29280: invalid directory path
ORA-06512: at "SYS.UTL_FILE", line 41
ORA-06512: at "SYS.UTL_FILE", line 478
ORA-06512: at line 7

SQL>

/appl/mydir を UTL_FILE パラメータに追加しました:

SELECT value
FROM V$PARAMETER
WHERE NAME = 'utl_file_dir';

/appl/mydir, /appl/mydir2, /appl/mydir3

UNIX ディレクトリは、UNIX 上のすべてのユーザーが書き込み可能です。

$ ls -l /appl/mydir
total 0
drwxrwsrwx    2 user userc 363968 Nov 27 13:46 mydir

Oracle Directory オブジェクトを使用することはオプションではなく、UTL_FILE_DIR 実装を使用することの欠点を認識しています。

上記のスクリプトが失敗する理由はありますか?

4

4 に答える 4

7

まず、11g で推奨される方法は、ディレクトリを作成し、utl_file を使用しないことです。

次に、ディレクトリ リストの設定に使用した正確なコマンドを確認してください。

SELECT value
FROM V$PARAMETER
WHERE NAME = 'utl_file_dir';

/appl/mydir, /appl/mydir2, /appl/mydir3

でしたか

alter system set utl_file_dir='/appl/mydir, /appl/mydir2, /appl/mydir3' scope = spfile;

また

alter system set utl_file_dir='/appl/mydir','/appl/mydir2','/appl/mydir3' scope = spfile;

最初の方法が間違っている場合は、最初の方法が間違っているため、2 番目の方法でやり直します (v$table の出力では同じように見えますが、間違っています)。

例えば:

declare
  2  
l_file_handle              UTL_FILE.FILE_TYPE;
  4  
begin
  l_file_handle := UTL_FILE.FOPEN('/tmp/foo/a',
                                  '/tmp/foo/a/filename.txt',
                                  'w');
  9  
  UTL_FILE.FCLOSE(l_file_handle);
 11  
  DBMS_OUTPUT.PUT_LINE('FINISHED');
 13  
end;
 15  /
declare
*
ERROR at line 1:
ORA-29280: invalid directory path
ORA-06512: at "SYS.UTL_FILE", line 41
ORA-06512: at "SYS.UTL_FILE", line 478
ORA-06512: at line 6


SQL> show parameter utl_fil

NAME                     TYPE    VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir                 string  /tmp/foo, /tmp/foo/a

うーん。そのデータを修正しましょう。

SQL> alter system set utl_file_dir='/tmp/foo','/tmp/foo/a' scope = spfile;

System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup open
ORACLE instance started.

Total System Global Area  263049216 bytes
Fixed Size          2225584 bytes
Variable Size         176163408 bytes
Database Buffers       79691776 bytes
Redo Buffers            4968448 bytes
Database mounted.
Database opened.
declare
  2  
l_file_handle              UTL_FILE.FILE_TYPE;
  4  
begin
  l_file_handle := UTL_FILE.FOPEN('/tmp/foo/a',
                                  '/tmp/foo/a/filename.txt',
                                  'w');
  9  
  UTL_FILE.FCLOSE(l_file_handle);
 11  
  DBMS_OUTPUT.PUT_LINE('FINISHED');
 13  
end;
 15  /

PL/SQL procedure successfully completed.

SQL> show parameter utl_file

NAME                     TYPE    VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir                 string  /tmp/foo, /tmp/foo/a
SQL> 

また、oracle ユーザーが /appl で r+x を、/appl/mydir で rwx を持っていることを確認します。

于 2012-11-28T15:49:37.483 に答える
0

このエラーを解決するための 2 つの解決手順::

1.OSレベルのユーザーがフォルダへの書き込み権限を持っていることを確認してください

2. ディレクトリ名には大文字を試してください。つまり、out_dir の代わりに OUT_DIR を使用します。

于 2012-11-28T14:55:09.843 に答える
-1

ファイル名については、パスではなく名前だけを入力してください。だからあなたは置くべきです

declare

l_file_handle              UTL_FILE.FILE_TYPE;

begin
  l_file_handle := UTL_FILE.FOPEN('/appl/mydir',
                                  ',filename',
                                  'W');

  UTL_FILE.FCLOSE(l_file_handle);

  DBMS_OUTPUT.PUT_LINE('FINISHED');

end;
于 2015-11-10T07:39:40.213 に答える