Oracle: экспорт таблицы с большими двоичными объектами в an.sql-файл, который можно импортировать снова
У меня есть таблица "изображения" с двумя полями:
- имя VARCHAR2
- BLOB-объект данных
Я хотел бы экспортировать эту таблицу в a .sql-файл, который я мог бы импортировать в другую систему. Я попытался сделать это с помощью помощника" выгрузка базы данных " разработчика Oracle SQL. Однако созданный файл содержит только содержимое для имен, но не данные. Таким образом, после импорта я получу все имена, но поле данных будет везде пустым.
Я бы ... действительно предпочитаю, чтобы это был только один файл (я видел несколько примеров, которые включали сброс данных в один файл на поле в fs...)
Можно ли сгенерировать такой скрипт с помощью SQL Developer? или есть какой-то другой способ/инструмент для этого?
5 ответов:
Я не думаю, что это возможно с SQL Developer (но тогда я не использую его очень часто).
Клиент SQL, который я использую - SQL Workbench/J - может это сделать.
Существует несколько способов экспорта этих данных.Создание собственного сценария
Он может создать SQL-скрипт, который использует специальную (инструментальную) нотацию для ссылки на внешний файл, что-то вроде:
INSERT INTO images (name, data) VALUES ('foobar', {$blobfile='blob_r1_c2.data'});
Приведенная выше инструкция может быть снова выполнена только с SQL Workbench. Это не совместим ни с одним другим клиентом SQL.
Используйте utl_raw
Другой альтернативой является использование "литерала blob", но из-за ограничения Oracle на 4000 байт для символьного литерала это работает только для правда малые значения blob:
INSERT INTO images (name, data) VALUES ('foobar', to_blob(utl_raw.cast_to_raw('......')));
, где символьный литерал для вызова
cast_to_raw
будет содержать шестнадцатеричные значения большого двоичного объекта. Поскольку для этого требуется 2 символа на "большой двоичный байт", вы не можете обрабатывать большие двоичные объекты размером более 2000 байт. Но этот синтаксис будет работать почти для всех инструментов Oracle SQL (если они могут обрабатывать скрипты с очень длинными строками).Входной файл SQL * Loader
Третий вариант-экспортировать данные в текстовый файл, который можно импортировать с помощью SQL * Loader:Текстовый файл будет содержать примерно следующее:
NAME DATA foobar blob_r1_c2.dataВместе со следующим файлом управления SQL * Loader:
OPTIONS (skip=1) LOAD DATA CHARACTERSET 'WE8ISO8859P15' INFILE 'images.txt' APPEND INTO TABLE IMAGES FIELDS TERMINATED BY '\t' TRAILING NULLCOLS ( NAME, lob_file_data FILLER, DATA LOBFILE(lob_file_data) TERMINATED BY EOF )Это может быть загружено с помощью SQL * Loader и, таким образом, не нуждается в SQL Workbench для импорта данных.
Подробнее находятся в руководстве: http://www.sql-workbench.net/manual/command-export.html
Edit
Как отметил Алекс в своем комментарии, вы также можете использовать экспорт DataPump, но для этого требуется доступ к файловой системе на сервере. Все вышеперечисленные решения хранят данные о клиенте.
Спасибо за ответ. Я воспользовался третьим вариантом. Сначала я загрузил SQL Workbench / J. затем я использовал следующую команду для экспорта:
WbExport -type=text -file='c:\temp\Images' delimiter='|' -decimal=',' -sourcetable=Images -formatfile=oracle;
Это произвело образы.txt-файл и множество Images_r * _c2.файлы данных и изображения.файл ctl.
Затем я мог бы использовать следующую команду для импорта:
sqlldr myuser@myhost/mypassword control=Images.ctl
Это определенно возможно в SQL developer.
- Сначала вам нужно экспортировать таблицу в Исходное расположение, выбрав соответствующая таблица(ы).
Инструменты > Экспорт Базы Данных
- выберите выходной формат как
loader
, а не insert, excel, который мы обычно использовать.Следующие шаги создадут
sqlldr
файлы управления и файлы данных, а такжеcreate table
ddl, если вы выбрали этот параметр.Вы можете использовать их для импорта (sqlldr
) данных в место назначения.Это лучшее решение и является портативным с точки зрения извлечения и распределения . Это дает гибкость доставки компонентов, которые будут развернуты через репозитории кода.
Вот ссылка, которая объясняет это шаг за шагом.Экспорт нескольких больших двоичных объектов с помощью Oracle SQL Developer
Если вам абсолютно необходимо использовать один .sql-файл для импорта BLOB-объекта можно сгенерировать скрипт с помощью PL / SQL:
set serveroutput on declare lob_in blob; i integer := 0; lob_size integer; buffer_size integer := 1000; buffer raw(32767); begin select data, dbms_lob.getlength(data) into lob_in, lob_size from images where name = 'example.png'; for i in 0 .. (lob_size / buffer_size) loop buffer := dbms_lob.substr(lob_in, buffer_size, i * buffer_size + 1); dbms_output.put('dbms_lob.append(lob_out, hextoraw('''); dbms_output.put(rawtohex(buffer)); dbms_output.put_line('''));'); end loop; end;
Его выводом будет содержимое большого двоичного объекта, закодированное следующим образом:
dbms_lob.append(lob_out, hextoraw('FFD8FFE0...0000')); dbms_lob.append(lob_out, hextoraw('00000000...0000')); ... dbms_lob.append(lob_out, hextoraw('007FFFD9'));
Который вы можете загрузить в уже вставленную строку с помощью PL / SQL:
declare lob_out blob; begin select data into lob_out from images where name = 'example.png' for update; dbms_lob.append(lob_out, hextoraw('FFD8FFE0...0000')); dbms_lob.append(lob_out, hextoraw('00000000...0000')); ... dbms_lob.append(lob_out, hextoraw('007FFFD9')); end;
Просто запомните результат .sql-файл будет огромным.
SQL workbench использует специальный формат файлов для blob-данных, в дополнение к .язык SQL. Если вы можете принять такие файлы, еще более простым решением является использование исходного импорта и экспорта Oracle . (Он устарел, но в отличие от DataPump Oracle, он не требует прав доступа на сервере.)
Вот хорошийучебник по части экспорта .