utl file rename operation failed

元气小坏坏 提交于 2019-12-12 02:35:30

问题


I have a mounted directory as follow:

etc/fstab

10.100.52.12:/ftp /ftp nfs rw,bg,hard,nointr,rsize=1048576,wsize=1048576,tcp,vers=3,timeo=60,actimeo=0 0 0

# ll

drwxr-xr-x    6 root       1000     62 Mar 29 13:48 ftp

So I have to 'move' a file from this directory to a directory inside ACFS

drwxrwxrwx 6 oracle oinstall  4096 Apr 10 09:34 ftp_files

these instead are the priv

(GRANTEE,TABLE_NAME,PRIVILEGE)
PUBLIC  FTP_IN READ
PUBLIC  FTP_IN WRITE
DB_SCHEMA FTP_OUT READ
DB_SCHEMA FTP_OUT WRITE

I execute this to move the files

declare
SRC        CONSTANT VARCHAR2(50) :=  'FTP_IN';
DST        CONSTANT VARCHAR2(50) :=  'FTP_OUT';

begin
     UTL_FILE.FRENAME(
       src_location => SRC,
       src_filename => 'test.txt',
       dest_location => DST,
       dest_filename => 'test.txt',
       overwrite => FALSE);
end;

but it doesn't work, I get

ORA-29292: file rename operation failed
ORA-06512: a "SYS.UTL_FILE", line 348
ORA-06512: a "SYS.UTL_FILE", line 1290
ORA-06512: a line 6
29292. 00000 -  "file rename operation failed"
*Cause:    A file rename attempt was refused by the operating system
           either because the source or destination directory does not
           exist or is inaccessible, or the source file isn't accessible,
           or the destination file exists.
*Action:   Verify that the source file, source directory, and destination
           directory exist and are accessible, and that the destination
           file does not already exist.

-rw-r--r-- 1 oracle oinstall 0 Apr 10 14:47 test.txt

But if I just try to delete the file instead of frename it, it works. So what this could be?

Here is the output from DBA_DIRECTORIES:

SYS FTP_IN  /sftp 
SYS FTP_OUT /acfs/external/ftp_files 


CREATE DIRECTORY FTP_IN as '/ftp';
GRANT READ, WRITE ON DIRECTORY FTP_IN TO DB_SCHEMA;
GRANT EXECUTE, READ, WRITE ON DIRECTORY FTP_IN TO SYSTEM WITH GRANT OPTION;

Thanks

TESTING UTL_FILE.FOPEN (SRC)

declare
SRC        CONSTANT VARCHAR2(50) :=  'FTP_IN';
DST        CONSTANT VARCHAR2(50) :=  'FTP_OUT';
l_file     UTL_FILE.FILE_TYPE;

begin

  l_file:=utl_file.fopen(SRC,'test.txt','W');
  UTL_FILE.PUT_LINE(l_file, CONVERT('test', 'AL32UTF8'));
  UTL_FILE.FCLOSE(l_file);

end;

-rw-r--r-- 1 oracle oinstall 5 Apr 10 15:21 test.txt

TESTING UTL_FILE.FOPEN (DST)

declare
SRC        CONSTANT VARCHAR2(50) :=  'FTP_IN';
DST        CONSTANT VARCHAR2(50) :=  'FTP_OUT';
l_file     UTL_FILE.FILE_TYPE;

begin

  l_file:=utl_file.fopen(DST,'test.txt','W');
  UTL_FILE.PUT_LINE(l_file, CONVERT('test', 'AL32UTF8'));
  UTL_FILE.FCLOSE(l_file);

end;

-rw-r--r-- 1 oracle oinstall 5 Apr 10 15:29 test.txt
[oracle@db01 ftp_files]$ pwd
/acfs/external/ftp_files
[oracle@db01 ftp_files]$

https://asktom.oracle.com/pls/apex/f?p=100:12:0::NO::P12_ORIG,P12_PREV_PAGE,P12_QUESTION_ID:Y,1,9534424300346182278


回答1:


"If i just try to delete the file instead of frename it, it works.. So what this could be?"

So the OS source directory exists and the oracle OS account has write privileges on it.

But the frename failure suggests that either :

  • the OS target directory does not exist, or
  • the oracle OS account does not have write privileges on it, or
  • the database DIRECTORY object has been defined incorrectly, or
  • the OS target directory already contains a file of that name.


来源:https://stackoverflow.com/questions/43323652/utl-file-rename-operation-failed

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!