Sql 使用UTL_文件包远程读取和写入文本文件

Sql 使用UTL_文件包远程读取和写入文本文件,sql,windows,plsql,oracle11g,privileges,Sql,Windows,Plsql,Oracle11g,Privileges,我正在尝试使用utl_文件包远程读取和写入文件,但oracle服务器无法在其他pc上读取和写入,因此我在“\\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:

我正在尝试使用utl_文件包远程读取和写入文件,但oracle服务器无法在其他pc上读取和写入,因此我在“\\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;
因此,我的问题是:

  • 我可以在共享路径上写和读吗,或者不能使用utl_文件完成

  • 为什么我会出现这个错误,因为我知道我已经给了该路径读写权限


    • 我建议你不要那样做

      首先,您要在SYS模式中创建该过程,一般来说,这是一个坏主意。别管系统(和系统);创建您自己的用户,授予它所需的权限(
      create SESSION,create PROCEDURE
      以及您可能需要的任何其他权限),连接到该用户,然后编写所需的代码

      为什么要动态创建目录?这是一个一次性作业,应该完成一次,连接为SYS。虽然您可能已经创建了这些目录(最好先
      DBMS\u输出。将要执行的命令放入行中,确保正确写入,然后实际运行),但您没有向任何人授予对这些目录的读写权限,所以,除了SYS,没有人可以使用它们,正如我上面所说的,不要使用SYS

      请注意,我说的不是操作系统特权,而是Oracle特权,例如

      grant read, write on directory some_dir to scott;
      
      最后,在非数据库服务器的计算机上创建目录时:应使用UNC(通用命名约定)并创建一个目录,字面意思为
      \\adel pc\test
      ;如果您将该目录映射到服务器上并使用其驱动器号,则它将不起作用


      至于错误本身,嗯。。。您发布了数百行代码,仅仅通过查看代码进行调试有点太多了,我们会错过您使用的其他对象。不知道,抱歉。

      问题终于解决了,问题出在windows系统权限上,我必须授予文件的完全控制权限,这样我就可以使用utl_文件在共享路径上进行写和读。

      创建对象不是“一般来说-一个坏主意”。这绝对是一个坏主意。至少它会在部署、导入/导出、安全性等方面产生问题。最坏的情况是,如果SYS架构损坏,它会产生支持问题。创建应用程序用户帐户非常简单,使用SYS真的没有任何借口。我正在动态创建目录,这样我就可以选择我电脑中的任何位置进行读/写。是的,我已经基于unc路径创建了一个目录。我想问题出在系统权限上,感谢您提供的信息。我授予utl_测试目录读写权限,并授予读写系统权限