使用 UTL_FILE 包远程读写文本文件

reading and writing text files using UTL_FILE package remotely

我 'am trying to read and write files using utl_file package remotely but the oracle server cant read and write on other pc ,so i make a shared path on '\\adel-pc\test',我想在那条路径上读写,但在读取时出现此错误:

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;

所以我的问题是:

我建议你不要那样做。

首先,您要在 SYS 架构中创建该过程,这通常来说是个坏主意。单独留下 SYS(和 SYSTEM);创建您自己的用户,授予它所需的权限(CREATE SESSION, CREATE PROCEDURE 和您可能需要的任何其他权限),连接到它然后编写您想要的代码。

为什么要动态创建目录?这是一项一次性工作,应该完成一次,连接为 SYS。尽管您可能已经创建了这些目录(最好首先 DBMS_OUTPUT.PUT_LINE 您将要执行的命令,但请确保其编写正确,然后 然后 实际上 运行 它),你没有授予任何人对它们的读或写权限,所以 - 除了 SYS 之外没有人可以使用它们,并且 - 正如我上面所说 - 不要为此使用 SYS。

请注意,我不是在谈论 操作系统 特权,而是 Oracle 特权,例如

grant read, write on directory some_dir to scott;

最后,关于在 不是 数据库服务器的计算机上创建目录:您应该使用 UNC(通用命名约定)并按字面意思创建目录 \adel-pc\test;如果您将该目录映射到服务器并使用其 驱动器号 .

,它将无法工作

至于错误本身,嗯...你贴了几百行代码,光看调试有点过分,我们错过了你使用的其他对象。不知道,抱歉。

问题终于解决了,问题出在 windows 系统权限上,我必须授予对文件的完全控制权限,所以是的,我可以使用 [=12= 在共享路径上写入和读取].