暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 2个挂载目录之间的UTL_FILE FRENAME

askTom 2017-03-13
876

问题描述

我的问题已经在
https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:9533980100346684832

无论如何,我不明白为什么我可以使用FOPEN在该目录中创建一个文件,为什么可以复制它,为什么可以删除它
但不能FRENAME

我可以做所有的操作,写,读一切 ..
这可能是Oracle在2个安装的网络目录之间的错误吗?


专家解答

您可以使用utl_file.frename进行操作,因为它是一个重命名命令,重命名不一定是移动操作。

从MOS 267469.1:

这是预期的行为。虽然这没有记录在 “提供的PL/SQL包和类型引用” 中,但这是一个限制。UTL_FILE.FRENAME在covers下调用UNIX rename() 函数。Unix rename() 将无法重命名来自不同文件系统的文件。

这将取决于底层操作系统在给出重命名请求时做什么。

例如,我在Windows上这样做

SQL> create directory TMP1 as 'c:\tmp';

Directory created.

SQL> create directory TMP2 as 'c:\temp';

Directory created.

SQL> create directory TMP3 as 'd:\tmp';

Directory created.

SQL> host dir > c:\tmp\my_file.dat

SQL> host dir c:\tmp\my_file.dat
 Volume in drive C is OS
 Volume Serial Number is 9CB0-0212

 Directory of c:\tmp

14/03/2017  11:15 AM             1,328 my_file.dat
               1 File(s)          1,328 bytes
               0 Dir(s)  255,950,286,848 bytes free

SQL> exec utl_file.frename('TMP1','my_file.dat','TMP2','my_file2.dat', TRUE);

PL/SQL procedure successfully completed.

SQL> host dir c:\temp\my_file2.dat
 Volume in drive C is OS
 Volume Serial Number is 9CB0-0212

 Directory of c:\temp

14/03/2017  11:15 AM             1,328 my_file2.dat
               1 File(s)          1,328 bytes
               0 Dir(s)  255,950,290,944 bytes free

SQL> host dir > d:\tmp\my_file3.dat

SQL> host dir d:\tmp\my_file3.dat
 Volume in drive D is TOSH2TB
 Volume Serial Number is 92F6-7EDE

 Directory of d:\tmp

14/03/2017  11:16 AM             1,328 my_file3.dat
               1 File(s)          1,328 bytes
               0 Dir(s)  448,014,528,512 bytes free

SQL> exec utl_file.frename('TMP3','my_file3.dat','TMP3','my_file4.dat', TRUE);

PL/SQL procedure successfully completed.

SQL> host dir d:\tmp\my_file4.dat
 Volume in drive D is TOSH2TB
 Volume Serial Number is 92F6-7EDE

 Directory of d:\tmp

14/03/2017  11:16 AM             1,328 my_file4.dat
               1 File(s)          1,328 bytes
               0 Dir(s)  448,014,528,512 bytes free

SQL> host dir c:\temp\my_file2.dat
 Volume in drive C is OS
 Volume Serial Number is 9CB0-0212

 Directory of c:\temp

14/03/2017  11:15 AM             1,328 my_file2.dat
               1 File(s)          1,328 bytes
               0 Dir(s)  255,950,290,944 bytes free

SQL> exec utl_file.frename('TMP2','my_file2.dat', 'TMP3','my_file5.dat', TRUE);

PL/SQL procedure successfully completed.

SQL> host dir d:\tmp\my_file5.dat
 Volume in drive D is TOSH2TB
 Volume Serial Number is 92F6-7EDE

 Directory of d:\tmp

14/03/2017  11:15 AM             1,328 my_file5.dat
               1 File(s)          1,328 bytes
               0 Dir(s)  448,014,524,416 bytes free
复制


所以我可以在一个驱动器和几个本地驱动器中重命名。

然后我在VirtualBox上使用Linux进行了此操作,从本地到父操作系统安装的驱动器进行了交谈

SQL> create directory TMP1 as '/tmp';

Directory created.

SQL> create directory TMP2 as '/media/sf_C_DRIVE/tmp';

Directory created.

SQL> exec utl_file.frename('TMP1','my_file.dat','TMP2','my_file2.dat', TRUE);
BEGIN utl_file.frename('TMP1','my_file.dat','TMP2','my_file2.dat', TRUE); END;

*
ERROR at line 1:
ORA-29292: file rename operation failed
ORA-06512: at "SYS.UTL_FILE", line 348
ORA-06512: at "SYS.UTL_FILE", line 1290
ORA-06512: at line 1


SQL> exec utl_file.frename('TMP1','my_file.dat','TMP1','my_file2.dat', TRUE);

PL/SQL procedure successfully completed.

SQL> exec utl_file.frename('TMP2','remote_file.dat','TMP2','remote_file2.dat', TRUE);

PL/SQL procedure successfully completed.

复制


所以

-本地到本地重命名很好
-远程安装到远程安装重命名很好
-本地重命名到远程安装不是

作为解决方法,您需要复制然后删除。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论