gpt4 book ai didi

ORACLE 11G UTL_FILE + UTL_FILE_DIR - 无效目录

转载 作者:行者123 更新时间:2023-12-02 17:46:45 27 4
gpt4 key购买 nike

您好,我正在运行 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 实现的缺点。

上述脚本失败的原因是什么?

最佳答案

首先,在 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

关于ORACLE 11G UTL_FILE + UTL_FILE_DIR - 无效目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13607854/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com