问题描述
我的问题已经在
https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:9533980100346684832
无论如何,我不明白为什么我可以使用FOPEN在该目录中创建一个文件,为什么可以复制它,为什么可以删除它
但不能FRENAME
我可以做所有的操作,写,读一切 ..
这可能是Oracle在2个安装的网络目录之间的错误吗?
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上这样做
所以我可以在一个驱动器和几个本地驱动器中重命名。
然后我在VirtualBox上使用Linux进行了此操作,从本地到父操作系统安装的驱动器进行了交谈
所以
-本地到本地重命名很好
-远程安装到远程安装重命名很好
-本地重命名到远程安装不是
作为解决方法,您需要复制然后删除。
从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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




