Oracle: экспорт таблицы с большими двоичными объектами в an.sql-файл, который можно импортировать снова


У меня есть таблица "изображения" с двумя полями:

  • имя VARCHAR2
  • BLOB-объект данных

Я хотел бы экспортировать эту таблицу в a .sql-файл, который я мог бы импортировать в другую систему. Я попытался сделать это с помощью помощника" выгрузка базы данных " разработчика Oracle SQL. Однако созданный файл содержит только содержимое для имен, но не данные. Таким образом, после импорта я получу все имена, но поле данных будет везде пустым.

Я бы ... действительно предпочитаю, чтобы это был только один файл (я видел несколько примеров, которые включали сброс данных в один файл на поле в fs...)

Можно ли сгенерировать такой скрипт с помощью SQL Developer? или есть какой-то другой способ/инструмент для этого?

5 9

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, он не требует прав доступа на сервере.)

Вот хорошийучебник по части экспорта .