gpt4 book ai didi

oracle - UTL_FILE.FOPEN() 过程不接受目录路径?

转载 作者:行者123 更新时间:2023-12-01 18:27:43 43 4
gpt4 key购买 nike

我正在尝试写入存储在 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

最佳答案

从 Oracle 9i 开始,有两种方法可以声明与 UTL_FILE 一起使用的目录。

较旧的方法是设置 INIT.ORA 参数 UTL_FILE_DIR。我们必须重新启动数据库才能使更改生效。该值可以像任何其他 PATH 变量一样;它接受通配符。使用这种方法意味着传递目录路径...

UTL_FILE.FOPEN('c:\temp', 'vineet.txt', 'W');

9i 中引入的替代方法是声明目录对象。

create or replace directory temp_dir as 'C:\temp'
/

grant read, write on directory temp_dir to vineet
/

目录对象需要确切的文件路径,并且不接受通配符。在这种方法中,我们传递目录对象名称...

UTL_FILE.FOPEN('TEMP_DIR', 'vineet.txt', 'W');

UTL_FILE_DIR 已被弃用,因为它本质上是不安全的 - 所有用户都可以访问路径中指定的所有操作系统目录,而目录对象的读写权限可以单独授予各个用户。此外,使用 Directory 对象,我们可以添加、删除或更改目录,而无需弹回数据库。

无论哪种情况,oracle 操作系统用户都必须对操作系统目录具有读取和/或写入权限。如果不明显,这意味着该目录必须对数据库服务器可见。因此,我们不能使用任何一种方法将本地 PC 上的目录公开给远程数据库服务器上运行的进程。文件必须上传到数据库服务器或共享网络驱动器。

<小时/>

如果oracle操作系统用户对操作系统目录没有适当的权限,或者数据库中指定的路径与实际路径不匹配,程序将抛出此异常:

ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7

此错误的 OERR 文本非常清楚:

29283 -  "invalid file operation"
*Cause: An attempt was made to read from a file or directory that does
not exist, or file or directory access was denied by the
operating system.
*Action: Verify file and directory access privileges on the file system,
and if reading, verify that the file exists.
<小时/>

从 Oracle 18c 开始,除了向后兼容性之外,不支持 UTL_FILE_DIR。

关于oracle - UTL_FILE.FOPEN() 过程不接受目录路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2751113/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com