【问题标题】:reading and writing text files using UTL_FILE package remotely使用 UTL_FILE 包远程读写文本文件
【发布时间】:2018-05-06 07:17:09
【问题描述】:

我正在尝试使用 utl_file 包远程读写文件,但 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_file 完成?

  • 为什么我会收到此错误,因为我知道我已授予该路径的读写权限。

【问题讨论】:

  • 我授予 utl_test 目录读写权限,同时也授予读写系统权限

标签: sql windows plsql oracle11g privileges


【解决方案1】:

我建议你不要那样做。

首先,您要在 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;如果您在服务器上映射该目录并使用其驱动器号,它将无法工作。

就错误本身而言,嗯……您发布了数百行代码,仅查看它来调试它有点太多了,我们错过了您使用的其他对象。不知道,对不起。

【讨论】:

  • 创建对象不是“一般来说 - 一个坏主意。”绝对总是一个坏主意。至少它会在部署、导入/导出、安全等方面产生问题。最坏的情况是,如果 SYS 模式损坏,它会产生支持问题。创建应用程序用户帐户非常简单,使用 SYS 真的没有任何借口。
  • 我正在动态创建目录,因此我可以选择我电脑中的任何位置进行读/写
  • 是的,我创建了一个基于 unc 路径的目录
  • 我认为问题出在系统权限上,谢谢提供信息
【解决方案2】:

终于问题解决了,问题出在windows系统权限,我必须给文件完全控制权限,所以是的,我可以使用utl_file在共享路径上读写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2011-12-19
    相关资源
    最近更新 更多