Vin*_*eet 24 oracle plsql oracle9i utl-file
我试图在存储在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
Run Code Online (Sandbox Code Playgroud)
这是代码
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
Run Code Online (Sandbox Code Playgroud)
APC*_*APC 37
从Oracle 9i开始,有两种方法或声明一个目录用于UTL_FILE.
较旧的方法是设置INIT.ORA参数UTL_FILE_DIR.我们必须重新启动数据库才能使更改生效.该值可以像任何其他PATH变量一样; 它接受通配符.使用这种方法意味着传递目录路径......
UTL_FILE.FOPEN('c:\temp', 'vineet.txt', 'W');
Run Code Online (Sandbox Code Playgroud)
另一种方法是声明一个目录对象.
create or replace directory temp_dir as 'C:\temp'
/
grant read, write on directory temp_dir to vineet
/
Run Code Online (Sandbox Code Playgroud)
目录对象需要确切的文件路径,并且不接受通配符.在这种方法中,我们传递目录对象名称...
UTL_FILE.FOPEN('TEMP_DIR', 'vineet.txt', 'W');
Run Code Online (Sandbox Code Playgroud)
不推荐使用UTL_FILE_DIR,因为它本身就不安全 - 所有用户都可以访问路径中指定的所有操作系统目录,而读取和写入权限可以单独授予单个用户.此外,使用Directory对象,我们可以在不弹跳数据库的情况下添加,删除或更改目录.
在任何一种情况下,oracleOS用户必须对OS目录具有读取和/或写入权限.如果不明显,这意味着必须从数据库服务器可见该目录.因此,我们不能使用任何一种方法将本地PC上的目录公开给在远程数据库服务器上运行的进程.必须将文件上载到数据库服务器或共享网络驱动器.
如果oracleOS用户在OS目录上没有适当的权限,或者数据库中指定的路径与实际路径不匹配,程序将抛出此异常:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7
Run Code Online (Sandbox Code Playgroud)
此错误的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.
Run Code Online (Sandbox Code Playgroud)
您需要向Oracle注册该目录。fopen 采用目录对象的名称,而不是路径。例如:
(您可能需要以 SYS 身份登录才能执行这些)
CREATE DIRECTORY MY_DIR AS 'C:\';
GRANT READ ON DIRECTORY MY_DIR TO SCOTT;
Run Code Online (Sandbox Code Playgroud)
然后,您可以在对 fopen 的调用中引用它:
execute sal_status('MY_DIR','vin1.txt');
Run Code Online (Sandbox Code Playgroud)