我正在尝试远程使用utl_file包读取和写入文件,但oracle服务器无法在其他PC上读写,因此我在' \\ adel-pc \ test&#上建立共享路径39;,我希望在该路径上进行读写,但在阅读时会出现此错误:
SQL Error [29283] [99999]: ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 8
java.sql.SQLException: ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 8
编写时出现此错误:
SQL Error [29283] [99999]: ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7
java.sql.SQLException: ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7
这是我的代码:
CREATE OR REPLACE DIRECTORY utl_test AS '\\10.10.60.11\test';
-- reading the file
DECLARE
p_dir varchar2(2000):='UTL_TEST';
p_file_name varchar2(2000):='IFD18021801IFEEDTL'; --file name
l_file UTL_FILE.file_type;
l_text varchar2(32767);
begin
l_file := UTL_FILE.fopen(p_dir,p_file_name,'r');
LOOP
UTL_FILE.get_line(l_file,l_text);
DBMS_OUTPUT.put_line(l_text);
END LOOP;
UTL_FILE.fclose(l_file);
EXCEPTION
WHEN UTL_FILE.invalid_operation THEN dbms_output.PUT_LINE('cannot open file invalid name');
WHEN UTL_FILE.read_error THEN dbms_output.PUT_LINE('cannot be read');
WHEN no_data_found THEN dbms_output.PUT_LINE('end of file');
UTL_FILE.fclose(l_file);
END;
--writing the file
declare
l_file UTL_FILE.file_type;
l_location varchar2(100) := 'UTL_TEST'; -- capital latter
l_filename varchar2(100) := 'am';
begin
l_file := UTL_FILE.fopen(l_location,l_filename,'w');
FOR i IN (SELECT * FROM hr.EMPLOYEES)
LOOP
UTL_FILE.PUT_LINE(l_file,i.EMPLOYEE_ID||' '||i.FIRST_NAME);
END LOOP;
UTL_FILE.fclose(l_file);
l_file := UTL_FILE.fopen(l_location,l_filename,'A');
UTL_FILE.PUT_LINE(l_file,'Additonal lines');
UTL_FILE.fclose(l_file);
END;
所以我的问题是:
我可以在共享路径上书写和阅读吗?或者无法使用utl_file完成?
为什么我收到这个错误,知道我给了读&写入该路径的权限。
答案 0 :(得分:0)
我建议你不要这样做。
首先,您在SYS模式中创建该过程,这通常是一个坏主意。不要让SYS(和SYSTEM)离开;创建自己的用户,授予它所需的权限(CREATE SESSION, CREATE PROCEDURE
以及您可能需要的任何其他权限),连接到它然后编写您想要的代码。
为什么要动态创建目录 ?这是一次性的工作,应该做一次,作为SYS连接。虽然您可能已经创建了这些目录(最好先执行DBMS_OUTPUT.PUT_LINE
命令,但要确保它已正确编写并且然后实际运行它),你做了没有给任何人授予READ或WRITE权限,所以 - 没有人可以使用它们,但SYS和 - 正如我上面所说的 - 不要使用SYS。
请注意,我不是在讨论操作系统权限,而是 Oracle 权限,例如
grant read, write on directory some_dir to scott;
最后,在不数据库服务器的计算机上创建目录时:您应该使用UNC(通用命名约定)并按字面创建一个目录\\adel-pc\test
;如果您在服务器上映射该目录并使用其驱动器号,它将无法工作。
从错误本身来看,呵呵......你发布了数百行代码,通过查看它来调试它有点太多了,我们错过了你使用的其他对象。不知道,抱歉。
答案 1 :(得分:0)
最后问题解决了,问题出在windows系统权限中,我不得不对文件赋予完全控制权限,所以是的,我可以使用utl_file在共享路径上进行写入和读取。