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;

如果它是第一种方式,则再次重做第二种方式,因为第一种方式是错误的(它在 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.确保操作系统级别的用户有写入文件夹的权限

2.尝试使用大写字母作为目录名称,即使用 OUT_DIR 代替 out_dir

于 2012-11-28T14:55:09.843 回答
0

空间不足也可能导致此问题。

如果挂载点上没有空间,Oracle 会抛出同样的错误。

ORA-29280: 无效的目录路径 ORA-06512: 在“SYS.UTL_FILE”,第 41 行

请检查 utl_file_dir 挂载点是否有可用空间。

对于 Linux 和 Solaris,请使用:

df -k ${UTIL_FILE_PATH}

我遇到了同样的问题,后来才知道这是挂载点的空间问题。

于 2016-08-12T13:24:17.233 回答
-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 回答