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

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

  • имя VARCHAR2
  • Data BLOB

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

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

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

5 ответов


Я не думаю, что это возможно с SQL Developer (но тогда я не использую его очень часто).

клиент SQL, который я использую -среда SQL верстак/Дж - можете это сделать.

существует несколько способов экспорта этих данных.

создать собственный скрипт

Он может создать сценарий 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 вызов будет содержать шестнадцатеричные значения BLOB. Поскольку для этого требуется 2 символа на "Blob-байт", вы не может обрабатывать капли размером более 2000 байт с этим. Но этот синтаксис будет работать почти для всех инструментов Oracle SQL (если они могут обрабатывать скрипты с очень длинными строками).

SQL * загрузчик входного файла

третий вариант-экспортировать данные в текстовый файл, который можно импортировать с помощью 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

редактировать

как отметил Алекс в своем комментарии, вы также можете использовать экспорт DataPump, но для этого требуется доступ к файловой системе на сервере. Все вышеперечисленные решения хранят данные на клиенте.


Thx для вашего ответа. Я использовал третий вариант. Сначала я загрузил 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 вместо вставки, 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;

его вывод будет содержимым BLOB, закодированным как:

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 оригинальный импорт и экспорт. (Он устарел, но в отличие от Oracle DataPump, он не требует прав доступа на сервере.)

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