[ОТВЕТИТЬ]
Опции темы
14.11.2013 16:10  
whitewizard
На текущем этапе можно забить и директорию с файлом не передавать. Это хотелось на будущее для универсальности.
Но какую тогда директорию указать в процедуре, чтобы работало?
 
14.11.2013 16:43  
OlegON
не ответил :) но ладно.
смотри, все логично, чтобы какие-то права юзерам давать, в базе должен быть объект. в данном случае надо создать объект типа директория.
не тестировал, но как-то так...
Код:
CREATE DIRECTORY dir AS 'c:\';
grant read on directory dir to пользователь;

CREATE OR REPLACE procedure readfile (fil in varchar2) is
cn varchar2(25);
v_file UTL_FILE.FILE_TYPE;

BEGIN
  v_file := UTL_FILE.FOPEN('dir',fil,'r');
  LOOP
      begin
        UTL_FILE.GET_LINE(v_file,cn); 
        dbms_output.put_line(cn);
      exception
        WHEN NO_DATA_FOUND THEN EXIT; 
      end;
  end loop;
  UTL_FILE.FCLOSE(v_file);
EXCEPTION
  WHEN utl_file.invalid_path THEN
     raise_application_error(-20000, 'ERROR: Invalid path for file.');
END;
/
 
14.11.2013 17:17  
whitewizard
Да это тоже самое и также не пашет
 
14.11.2013 17:34  
OlegON
Это не тоже самое ни разу... Показывай ошибки... Можно
EXCEPTION
WHEN utl_file.invalid_path THEN
raise_application_error(-20000, 'ERROR: Invalid path for file.');
убрать на время тестирования.
 
14.11.2013 17:44  
whitewizard
ORA-29280: Invalid directory path
ORA-06512: AT "SUPERMAG.READFILE", line 6

line 6 - это "v_file := UTL_FILE.FOPEN('dir',fil,'r');"
 
14.11.2013 17:57  
OlegON
ну чтож, как партизан-то...
Код:
select directory_path from dba_directories where directory_name='DIR';
покажи?
 
14.11.2013 18:03  
whitewizard
Всё нормально

Код:
SQL> select directory_path from dba_directories where directory_name='DIR';

DIRECTORY_PATH
--------------------------------------------------------------------------------

c:\

SQL>
 
14.11.2013 18:25  
bayan
Код:
create or replace procedure readfile (dir in varchar2, fil in varchar2) is
cn varchar2(25);
v_file UTL_FILE.FILE_TYPE;

BEGIN
  v_file := UTL_FILE.FOPEN(dir,fil,'r');
  LOOP
      begin
        UTL_FILE.GET_LINE(v_file,cn); 
        dbms_output.put_line(cn);
      exception
        WHEN NO_DATA_FOUND THEN EXIT; 
      end;
  end loop;
  UTL_FILE.FCLOSE(v_file);
EXCEPTION
  WHEN utl_file.invalid_path THEN
     raise_application_error(-20000, 'ERROR: Invalid path for file.');
END;
Код:
SQL> create directory TEMP_DIR as '/u/oracle/tmp2';

Directory created.

SQL> select directory_path from dba_directories where directory_name='TEMP_DIR';

DIRECTORY_PATH
--------------------------------------------------------------------------------
/u/oracle/tmp2
SQL> GRANT read, write ON DIRECTORY TEMP_DIR to repadmina;

Grant succeeded.
ENISWEB>>exec repadmina.readfile('TEMP_DIR','111.txt');
111
222
333
444
555
666
777
888
999
000

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.03
Срослось после того как я открыл этот файл
Код:
v_file := UTL_FILE.FOPEN(dir,fil,'w');
UTL_FILE.FCLOSE(v_file);
Грубо говоря, создал файл из oracle. Дело в правах 100%
 
14.11.2013 18:34  
whitewizard
Оказалось всё ещё плачевнее
надо писать не
Код:
  v_file := UTL_FILE.FOPEN('dir',fil,'r');
а

Код:
  v_file := UTL_FILE.FOPEN('DIR',fil,'r');
пошёл пить валерьянку
 
14.11.2013 18:40  
OlegON
Судя по ошибке ORA-29280: Invalid directory path, whitewizard что-то скрывает ;) Но, действительно, предлагаю дать на директорию с содержимым права "Всем" и все.
 
 


Опции темы



Часовой пояс GMT +3, время: 02:57.

Все в прочитанное - Календарь - RSS - - Карта - Вверх 👫 Яндекс.Метрика
Форум сделан на основе vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.