Как использовать хранимую процедуру для чтения файла в оракул БД

Я пытаюсь прочитать файл в мою таблицу оракулов в виде большого двоичного объекта. Файл данных *.gz. Я посмотрел в сети и нашел несколько примеров, и вот что я придумал:

создать или заменить PROCEDURE upload_supp_data
IS
   src_file   BFILE;
   dst_file   BLOB;
   lgh_file   BINARY_INTEGER;
   data_dir varchar2(20):= '/tmp/'; имя_файла varchar2(50):= '200912020200.rep-ids-top50-sip.txt.gz';
BEGIN

   src_file:= BFILENAME (data_dir, file_name);

   - вставить NULL-запись для блокировки INSERT INTO alarms_supplemental
               (alarm_id, resource_id, extramentaldata)
        VALUES (13794740, 1, EMPTY_BLOB ()), ВОЗВРАЩАЯ дополнительные данные INTO dst_file;

   - заблокировать запись ВЫБРАТЬ дополнительные данные INTO dst_file ОТ alarms_supplemental
        WHERE alarm_id = 13794740 ДЛЯ ОБНОВЛЕНИЯ; - открыть файл DBMS_LOB.fileopen (src_file, DBMS_LOB.file_readonly);
   - определить длину lgh_file:= DBMS_LOB.getlength (src_file);
   - прочитать файл DBMS_LOB.loadfromfile (dst_file, src_file, lgh_file);

   - обновить поле большого двоичного объекта UPDATE ALARMS_SUPPLEMENTAL
      SET extramentaldata = dst_file
    WHERE ALARM_ID = 13794740;

   - закрыть файл DBMS_LOB.fileclose (src_file);
END upload_supp_data;

Когда я запускаю это, я получаю эти ошибки:

ORA-22285: несуществующий каталог или файл для операции FILEOPEN

ORA-06512: по адресу "SYS.DBMS_LOB", строка 635

ORA-06512: в "AIP_DBA.UPLOAD_SUPP_DATA", строка 29

ORA-06512: в строке 2

Процесс завершен.

Я поэкспериментировал с путями по-разному: "/ tmp /", "tmp", "/ tmp". Имя файла правильное, поэтому я не понимаю, что не так. На самом деле это первая хранимая процедура, которую я когда-либо написал, так что это может быть очень простой вещью. Я надеюсь, что кто-то может помочь мне с этим. Кстати, я использую Oracle SQL Developer.

3 ответа

Вам понадобится администратор базы данных:

CREATE DIRECTORY brian_tmp AS '/tmp';
GRANT READ, WRITE ON DIRECTORY brian_tmp TO brian;

Тогда на месте /tmp/ в вашем коде, вы бы положили brian_tmp, Администратор базы данных может не захотеть предоставлять вам доступ ко всем /tmp (поскольку ваш пользователь теперь может делать что угодно в этом каталоге, маскируясь под пользователем Unix, под которым работает Oracle), в этом случае вам потребуется подкаталог.

Вам нужен администратор базы данных для создания объекта каталога в Oracle (не каталога на диске). Что-то вроде:

CREATE DIRECTORY admin AS 'oracle/admin';

Затем разрешения предоставляются для каталога; как и другие объекты схемы (виды, пакеты и т. д.)

В дополнение к другим ответам обратите внимание, что при использовании вашего каталога, например:

CREATE DIRECTORY my_dir as '/tmp';
GRANT READ, WRITE ON DIRECTORY my_dir TO this_user;
...
data_dir varchar2(20) := 'MY_DIR';

Имя каталога должно быть в верхнем регистре, если оно специально не создано в нижнем регистре с использованием двойных кавычек в операторе CREATE:

CREATE DIRECTORY "My_Dir" AS '/tmp';

В этом случае вам всегда нужно ссылаться на имя в двойных кавычках в SQL, а в правильном случае в программных ссылках:

GRANT READ, WRITE ON DIRECTORY "My_Dir" TO this_user;
...
data_dir varchar2(20) := 'My_Dir';
Другие вопросы по тегам