无法写入文件。神谕

时间:2013-02-13 14:11:31

标签: oracle permissions directory

我正在尝试执行这些行:

DECLARE
    V_FILEHANDLE UTL_FILE.FILE_TYPE;
BEGIN
    V_FILEHANDLE := UTL_FILE.FOPEN('C:\samples', '1.csv', 'w');
    UTL_FILE.PUT_LINE(V_FILEHANDLE, 'sample string');
    UTL_FILE.FCLOSE_ALL;
END;

以前我已经成功执行了这些陈述:

create directory sample as 'C:\samples';

(虽然我找不到C:\驱动器上的目录?) 但这给了我一个输出:

  

ORA-29280:“目录路径无效”

     

* 原因:相应的目录对象不存在。

     

* 操作:更正目录对象参数,或使用CREATE DIRECTORY命令创建相应的目录对象。

此外,我已尝试授予我用户名的优先权:

grant read, write on directory sample to brick;

但这给了我一个类似

的输出
  

ORA-01749:您不得向/从自己授予/撤销特权

我做错了什么?

2 个答案:

答案 0 :(得分:1)

替换

V_FILEHANDLE := UTL_FILE.FOPEN('C:\samples', '1.csv', 'w');

with:

V_FILEHANDLE := UTL_FILE.FOPEN('SAMPLE', '1.csv', 'w');

作为indicated in the doc,第一个参数是目录对象 name


在旧版本的Oracle中,UTL_FILE.open used to be the directory path的第一个参数,但自引入DIRECTORY对象(在9i中)以来,这已被弃用。

答案 1 :(得分:0)

非常感谢SOOO!我发现了我的错误。我正在创建像

这样的目录

create or REPLACE DIRECTORY dat_dir as '/u01/oracle/Desktop/Migration/Data';

然后我在我的UTL_FILE中使用它,就像这样

file1 := utl_file.fopen('dat_dir','output.txt','w');

我一直在努力工作3天。我发现了问题,因为它在引号中,它是一个区分大小写的字符串。无论最初我是否使用dat_dir都没关系,oracle以大写形式存储这样的东西。你的简单回答让我意识到这一点,谢谢你一百万次!

正确的做法是:

file1 := utl_file.fopen('DAT_DIR','output.txt','w');