我正在尝试执行这些行:
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:您不得向/从自己授予/撤销特权
我做错了什么?
答案 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');