Пакет PL / SQL TEXT_IO

#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:

Общий подход таков: напишите файл на сервере и загрузите его. Или, что лучше, событие, не записывайте его, просто передайте в потоковом режиме. Довольно сложный, да.