PL SQL не умеет читать из файла - PullRequest
1 голос
/ 01 апреля 2011

Я новичок в PL / SQL и пытаюсь читать из файла через PL / SQL, как показано ниже.Я продолжаю получать "ORA-20000" для этого.Что-то не так я делаю?

declare

  output_file  utl_file.file_type;
  firstline    VARCHAR2(1000);
  secondline   VARCHAR2(1000);

BEGIN
  output_file := utl_file.fopen (&1,&2, 'W');
  utl_file.fclose(output_file);
EXCEPTION
  WHEN utl_file.invalid_path THEN
  RAISE_APPLICATION_ERROR(-20000, 'ERROR: INVALID PATH FOR FILE.');
END;
/

Ответы [ 2 ]

5 голосов
/ 01 апреля 2011

«Я указал путь для локального клиентского компьютера»

PL / SQL работает на сервере базы данных и может видеть только те каталоги, которые видны из этого поля.Обычно это просто каталоги, локальные для сервера , если только у вас не подключены сетевые диски.Поэтому, если вы не используете локальный компьютерный диск на сервере базы данных, PL / SQL не сможет получить доступ к вашим файлам.

Имейте в виду, что права доступа к каталогам также применимы;база данных может считывать и записывать в каталоги только в том случае, если пользователь ОС oracle или группа dba (или эквиваленты Windows) могут их читать и записывать. Подробнее .


Обратите внимание, что пользовательские привилегии ОС просто образуют пул потенциально доступных каталогов.По умолчанию база данных не имеет доступа ни к каким каталогам ОС.

Когда впервые был представлен UTL_FILE (я думаю, Oracle 7), его доступные пути к каталогам определялись параметром UTL_FILE_DIR в файле init.ora.Это было неудобно - нам пришлось перезапустить базу данных, чтобы применить изменения, а также небезопасно, поскольку доступ на чтение и запись был предоставлен глобально, для всех каталогов всем пользователям.

В Oracle 9i мы получилиКАТАЛОГ базы данных объекта.Это удобно, потому что мы можем создать или удалить DIRECTORY с прямым DDL, поэтому перезапуски не требуются.Более того, привилегии в DIRECTORY предоставляются именованным пользователям, и мы можем различать привилегии READ или WRITE.

Но в обоих случаях мы должны использовать абсолютные пути к файлам.Нет относительных путей, нет подстановочных знаков.

Синтаксис описан в онлайн-документации Oracle. Узнайте больше .


«как я могу получить доступ к файлам на моем локальном клиентском компьютере?»

Одним из решений является разделение вашего локального диска с сетью.Это редко желательно.

Более практичное решение - переместить файлы с локального диска на сервер базы данных, используя что-то вроде ftp.Как вы реализуете это зависит от деталей вашей ситуации.Если это специальное требование, тогда будет достаточно командной строки ftp или старого доброго WinSCP.Если это то, что вам нужно для обычных пользователей, то вы, вероятно, захотите встроить функциональность в свое приложение.

5 голосов
/ 01 апреля 2011

Предположительно, это скрипт SQL * Plus, верно? Какие значения вы предоставляете для двух переменных замещения?

Вы пытаетесь прочитать файл на сервере? Или на вашем локальном клиентском компьютере?

Вы создали объект каталога Oracle, который соответствует имени объекта каталога, который вы вводите во время выполнения?

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