Pl SQL читает текстовый файл из каталога в базе данных

Мне нужно прочитать текстовый файл, который я создал в базе данных. Я не уверен, какой путь будет подходящим для параметра каталога UTL_FILE.FOPEN. Я сбит с толку, потому что путь находится не на моем локальном компьютере.

Путь, по которому я нашел этот файл, выглядит примерно так

\\{something here}\winixdb$\{schema here I think}\dev\data

Это мой текущий код.

Declare

f UTL_FILE.FILE_TYPE;
s VARCHAR2(200);

begin

  f:= UTL_FILE.FOPEN({path_here}, 'certs_file.txt', 'R');
  UTL_FILE.GET_LINE(f,s);
  UTL_FILE.FCLOSE(f);
  dbms_output.put_line(s);

end;

Прямо сейчас, если я укажу там точный путь, будет ошибка:

ORA-2928: Invalid Directory Path

Я пробовал искать другие ресурсы, но они говорят о пути, который можно найти в вашей локальной среде. Кроме того, я не совсем понимаю идею файла в вашей базе данных.

Я хочу, чтобы этот файл был выведен в СУБД.


person qaispak    schedule 13.07.2016    source источник
comment
Возможно, ответ на этот вопрос поможет вам. directory - это объект базы данных, который вам нужно создать (точно так же, как создание таблицы или индекса). Расположение находится на сервере базы данных, а не на клиенте.   -  person Glenn    schedule 13.07.2016
comment
Могу ли я получить доступ к местоположению, используя жабу, перейдя к схеме, каталогу и найдя его там? изменить: я сделал это и ввел точный путь к каталогу, но, похоже, я все еще получаю ошибки   -  person qaispak    schedule 13.07.2016
comment
Я предполагаю, что путь, о котором мы говорим, - это путь UNC и что база данных работает в Windows (поправьте меня, если я ошибаюсь). Вы помещаете полный UNC-путь в вызов fopen? Этот путь указан в вашей utl_file_dir настройке? Или вы создали объект каталога, указывающий на этот UNC-путь? Имеет ли пользователь операционной системы, запускающий службу Oracle, доступ к этому UNC-пути?   -  person Justin Cave    schedule 13.07.2016


Ответы (1)


Сначала вы должны объявить каталог, к которому хотите получить доступ {path_here}:

CREATE OR REPLACE DIRECTORY  MY_PATH_ON_DBMS as '{path_here}';

(если он уже существует, вы должны найти его с помощью select * from dba_directories;)

; убедитесь, что oracle пользователь может читать его в СУБД;

Затем назовите его по имени в своем коде:

Declare
  f UTL_FILE.FILE_TYPE;
  s VARCHAR2(200);
begin
  f:= UTL_FILE.FOPEN('MY_PATH_ON_DBMS', 'certs_file.txt', 'R');
  UTL_FILE.GET_LINE(f,s);
  UTL_FILE.FCLOSE(f);
  dbms_output.put_line(s);
end;
person J. Chomel    schedule 14.07.2016
comment
Должен ли пользователь оракула иметь разрешение на запись или достаточно разрешения на чтение? - person RayCW; 14.07.2016
comment
Доступа только для чтения должно быть достаточно. Спасибо, я обновил это. - person J. Chomel; 14.07.2016
comment
Я должен это декларировать? Я вижу некоторые пакеты в других схемах, в которых он не объявлен (или объявлен как переменная). - person qaispak; 18.07.2016
comment
Вы объявляете это в базе данных, а не в пакете. Проверьте, существует ли он уже с select * from dba_directories; - person J. Chomel; 18.07.2016
comment
да. Я вижу там имя каталога, V_COP. Если я создам его в своем файле plsql, я получаю сообщение об ошибке недостаточной priveldges, но это не имеет смысла, поскольку я могу перейти в каталог и прочитать / записать файлы. Кроме того, я вижу, что люди читают файлы, не объявляя каталог. - person qaispak; 18.07.2016
comment
Что означает V_COP в вашей базе данных? Это должно быть \\{something here}\winixdb$\{schema here I think}\dev\data или {schema here I think}\dev\data или что-то в этом роде? - person J. Chomel; 18.07.2016
comment
это имя каталога, и он сейчас его читает. Мне не пришлось ничего кричать или декларировать ... так что не знаю, но, возможно, ваш ответ все еще правильный. Я просто не извлекал из этого выгоду. - person qaispak; 18.07.2016