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
) данные в пункт назначения.
Это лучшее решение и является портативным с точки зрения добычи и распределения . Это дает гибкость доставки компонентов для развертывания через репозитории кода.
вот ссылка, которая объясняет, шаг за шагом.
Если вам абсолютно необходимо использовать один .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, он не требует прав доступа на сервере.)
вот хороший учебник по части экспорта.