#sql #oracle #plsql #sqlplus
#sql #Oracle #plsql #sqlplus
Вопрос:
Я пытаюсь выполнить запись в локальный файл из скрипта PL / SQL. Для того, чтобы сделать это, я пытаюсь использовать пакет TEXT_IO в PL / SQL.
DECLARE
file_out text_io.file_type;
len number;
blob_file blob;
my_var RAW(50);
bstart NUMBER := 1;
bytelen NUMBER := 50;
BEGIN
SELECT xxx
INTO blob_file
FROM yyy
WHERE zzz
dbms_lob.read(blob_file, bytelen, bstart, my_var);
file_out := text_io.fopen('local_file_path', 'w');
text_io.put_raw(file_out, my_var);
text_io.fflush(file_out);
text_io.fclose(file_out);
END;
/
quit
Однако, когда я запускаю этот скрипт, я получаю сообщение об ошибке,
PLS-00201: identifier 'TEXT_IO.FILE_TYPE' must be declared
Кто-нибудь знает, как я могу исправить эту ошибку и как я могу записать содержимое большого двоичного объекта в файл, как я пытаюсь сделать?
Спасибо,
ktm
Ответ №1:
TEXT_IO
существует только в Oracle Forms, которые имели (в старые клиентские / серверные времена) интерпретатор PL / SQL на стороне клиента. Если вы используете SQL * Plus для выполнения PL / SQL, как, похоже, вы делаете здесь, TEXT_IO
пакет не будет доступен, и вы не сможете выполнить запись в файл на клиентском компьютере (за исключением странной настройки, когда сервер монтирует диск, который предоставляет ваш клиент, а затем переходит к записи на этот монтируемый).
Теперь вы обычно можете использовать SQL * Plus для прямой записи в локальный файл с помощью команды SPOOL. К сожалению, вероятно, маловероятно, что вы могли бы сделать это для большого двоичного объекта в общем случае.
Комментарии:
1. Я понимаю. Ха-ха, это все очень сложно… Думаю, я просто напишу быструю Java-программу для загрузки большого двоичного объекта.
Ответ №2:
Если вы хотите создать файл на сервере, UTL_FILE — хороший выбор. Этот пакет может записывать файлы в любой КАТАЛОГ, указанный в базе данных. КАТАЛОГ создается в Oracle с помощью CREATE DIRECTORY и может быть связан с любым доступным для записи каталогом, доступным СУБД (на стороне сервера).
Комментарии:
1. Операционная система пытается записать локальный файл. С помощью UTL_FILE вы не можете записать локальный файл, за исключением случая, когда вы запускаете хранимую процедуру на том же компьютере, на котором размещен сервер базы данных. Обычно это не так.
Ответ №3:
Общий подход таков: напишите файл на сервере и загрузите его. Или, что лучше, событие, не записывайте его, просто передайте в потоковом режиме. Довольно сложный, да.