ORACLE 11G UTL_文件+;UTL\u文件\u目录-无效目录

ORACLE 11G UTL_文件+;UTL\u文件\u目录-无效目录,oracle,oracle11g,utl-file,Oracle,Oracle11g,Utl File,您好,我正在运行Oracle 11,我正在尝试使用UTL_FILE.FOPEN写入服务器盒上的目录 为了测试这一点,我使用以下脚本(包括输出): 我已将/appl/mydir添加到UTL_文件参数中: SELECT value FROM V$PARAMETER WHERE NAME = 'utl_file_dir'; /appl/mydir, /appl/mydir2, /appl/mydir3 UNIX目录可由UNIX上的所有用户写入: $ ls -l /appl/mydir total

您好,我正在运行Oracle 11,我正在尝试使用UTL_FILE.FOPEN写入服务器盒上的目录

为了测试这一点,我使用以下脚本(包括输出):

我已将/appl/mydir添加到UTL_文件参数中:

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目录对象不是一个选项,我知道使用UTL_FILE_DIR实现的缺点


了解上述脚本失败的原因吗?

克服此错误的两个解决步骤:

1.确保操作系统级用户具有写入文件夹的权限


2.尝试使用大写字母作为目录名,即首先,在11g中,首选的方法是创建一个目录,而不是使用utl\U文件,而不是使用out\U dir

其次,请验证您用于设置目录列表的确切命令:

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;

如果是第一种方式,请再次以第二种方式重做,因为第一种方式是错误的(在v$table输出中看起来相同,但它是错误的)

例如:

哼。现在让我们修复这些数据

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

作为文件名,只放名称而不是路径。 所以你应该把

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;

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

如果装载点上没有空间,Oracle将抛出相同的错误

ORA-29280:无效的目录路径ORA-06512:位于“SYS.UTL_文件”第行 41

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

对于Linux和Solaris,请使用:

df -k ${UTIL_FILE_PATH}

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

-您上面的内容似乎与文档完全不匹配。@Mat:以什么方式?上面的代码应该是有效的,并且可以在另一个Oracle 9环境中工作。请记住,Oracle用户(即运行db的用户)需要对目录进行读/写/执行,才能到达目录并写入文件。oracle用户在/appl上至少有r+x吗?@RobertGallow:即使是9.2版的文档也声明第一个参数必须是大写的目录对象,第二个参数不能包含路径。@严格来说,这不是真的。目录对象是确定的方法,但即使在11gR2中也仍然支持路径。不应在参数2中传递路径,但它们再次被允许(忽略)。尝试使用大写,但仍然不起作用。你知道我将如何检查操作系统级用户是否有权限吗。目标目录是777。这不是说所有人都可以写吗?文件是否具有写权限?看起来就是这样。参数设置错误。不错,达扎尔。谢谢
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> 
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;
df -k ${UTIL_FILE_PATH}