我试图写入存储在c:\驱动器名为vin1.txt的文件,并得到此错误。请建议!
> ERROR at line 1: ORA-29280: invalid
> directory path ORA-06512: at
> "SYS.UTL_FILE", line 18 ORA-06512: at
> "SYS.UTL_FILE", line 424 ORA-06512: at
> "SCOTT.SAL_STATUS", line 12 ORA-06512:
> at line 1
这里是代码
create or replace procedure sal_status
(
p_file_dir IN varchar2,
p_filename IN varchar2)
IS
v_filehandle utl_file.file_type;
cursor emp Is
select * from employees
order by department_id;
v_dep_no departments.department_id%TYPE;
begin
v_filehandle :=utl_file.fopen(p_file_dir,p_filename,'w');--Opening a file
utl_file.putf(v_filehandle,'SALARY REPORT :GENERATED ON %s\n',SYSDATE);
utl_file.new_line(v_filehandle);
for v_emp_rec IN emp LOOP
v_dep_no :=v_emp_rec.department_id;
utl_file.putf(v_filehandle,'employee %s earns:s\n',v_emp_rec.last_name,v_emp_rec.salary);
end loop;
utl_file.put_line(v_filehandle,'***END OF REPORT***');
UTL_FILE.fclose(v_filehandle);
end sal_status;
execute sal_status('C:\','vin1.txt');--Executing
6条答案
按热度按时间sbdsn5lh1#
从Oracle 9 i开始,有两种方法可以声明一个目录来使用UTL_FILE。
旧的方法是设置INIT.ORA参数UTL_FILE_DIR。我们必须重新启动数据库,以便更改生效。该值可以像任何其他PATH变量一样;它接受通配符。使用这种方法意味着传递目录路径...
9 i中引入的另一种方法是声明一个目录对象。
目录对象需要确切的文件路径,并且不接受通配符。在这种方法中,我们传递目录对象名称...
UTL_FILE_DIR已被弃用,因为它本质上是不安全的-所有用户都可以访问路径中指定的所有OS目录,而Directory对象的读写权限可以单独授予各个用户。此外,使用Directory对象,我们可以添加,删除或更改目录,而不会反弹数据库。
在这两种情况下,
oracle
操作系统用户必须对操作系统目录 * 具有读和/或写权限 *。如果不明显,这意味着 * 该目录必须从数据库服务器可见 *。因此,我们不能使用任何一种方法将本地PC上的目录公开给远程数据库服务器上运行的进程。文件必须上载到数据库服务器或共享网络驱动器。如果
oracle
操作系统用户对操作系统目录没有相应的权限,或者数据库中指定的路径与实际路径不匹配,则程序将抛出此异常:此错误的OERR文本非常清楚:
自Oracle 18 c起,不支持UTL_FILE_DIR,但向后兼容性除外。
mhd8tkvw2#
不要忘记,文件的路径是在实际的oracle服务器机器上,而不是任何可能调用存储过程的本地开发机器上。这可能是非常明显的,但应该记住的东西。
inkz8wg93#
您需要register the directory与Oracle。fopen采用目录对象的名称,而不是路径。例如:
(you可能需要以SYS身份登录才能执行这些操作)
然后,您可以在调用fopen时引用它:
ndasle7k4#
目录名称似乎区分大小写。我也遇到了同样的问题,但当我提供大写的目录名时,它就起作用了。
r1zhe5dt5#
您需要让DBA修改init.ora文件,将您想要访问的目录添加到'utl_file_dir'参数中。然后需要停止并重新启动数据库示例,因为只有在启动数据库时才读取init.ora。
您可以通过运行以下查询来查看(但不能更改)此参数:
分享和享受。
qmelpv7a6#
对于utl_file.open(location,filename,mode),我们需要为location给予目录名,而不是path。例如:DATA_FILE_DIR,这是目录名,并检查该特定目录名的目录路径。