чтение и запись текстовых файлов с использованием пакета UTL_FILE удаленно - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь удаленно читать и записывать файлы, используя пакет utl_file, но сервер oracle не может читать и записывать на другом компьютере, поэтому я делаю общий путь на «\\ 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?

  • почему я получаю эту ошибку, зная, что дал разрешения на чтение и запись для этого пути.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

наконец проблема решена, проблема была в системных привилегиях Windows, мне пришлось дать полный контроль над файлами, так что да, я могу писать и читать по общему пути, используя utl_file.

0 голосов
/ 06 мая 2018

Я бы посоветовал вам не делать этого таким образом.

Прежде всего, вы создаете эту процедуру в схеме SYS, что, вообще говоря, плохая идея. Оставьте SYS (и SYSTEM) в покое; создайте своего собственного пользователя, предоставьте ему необходимые привилегии (CREATE SESSION, CREATE PROCEDURE и любые другие, которые вам могут потребоваться), подключитесь к нему и затем напишите нужный код.

Почему вы создаете каталоги динамически ? Это разовая работа, которую следует выполнить один раз, подключив ее как SYS. Хотя вы, возможно, и создали эти каталоги (неплохо было бы сначала выполнить команду DBMS_OUTPUT.PUT_LINE, которую вы собираетесь выполнить, убедиться, что она правильно написана, а , а затем фактически запустить ее), вы не предоставили READ ни ЗАПИШИТЕ на них привилегии кому-либо, поэтому - никто не может их использовать, кроме SYS и - как я уже говорил выше - не используйте SYS для этого.

Обратите внимание, что я говорю не о привилегиях операционной системы , а о Oracle привилегиях, например

grant read, write on directory some_dir to scott;

Наконец, при создании каталога на компьютере, который является , а не сервером базы данных: вы должны использовать UNC (Universal Naming Convention) и создать каталог буквально как \\adel-pc\test; он не будет работать, если вы сопоставите этот каталог на сервере и используете его букву диска .

Что касается самой ошибки, да ... вы опубликовали несколько сотен строк кода, отладку слишком много, просто глядя на нее, и мы пропускаем другие объекты, которые вы используете. Понятия не имею, извините.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...