使用 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;
所以我的问题是:
我可以在共享路径上写入和读取吗?还是不能使用 utl_file 完成?
为什么我会收到此错误,因为我知道我已授予该路径的读写权限。
我建议你不要那样做。
首先,您要在 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= 在共享路径上写入和读取].
我 '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;
所以我的问题是:
我可以在共享路径上写入和读取吗?还是不能使用 utl_file 完成?
为什么我会收到此错误,因为我知道我已授予该路径的读写权限。
我建议你不要那样做。
首先,您要在 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= 在共享路径上写入和读取].