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, время: 12:10.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.