Как использовать хранимую процедуру для чтения файла в оракул БД
Я пытаюсь прочитать файл в мою таблицу оракулов в виде большого двоичного объекта. Файл данных *.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';