Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вставка массива байтов в поле типа blob 
V
    Опции темы
charodej
Дата 2.9.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.3.2008
Где: Тула

Репутация: нет
Всего: нет



Добрый день, уважаемые участники форума!

Я только недавно начал работать с СУБД Oracle и поэтому мой вопрос быть может, ламерский...

Значит так, СУБД Oracle будет поддерживаться нашей программой, которая автоматически формирует скрипт на вставку в базу каких-либо данных.
Где-то в недрах программы формируются данные, которые необходимо вставить в поле типа blob, по сути это массив байтов... byte[] 
В других СУБД я могу использовать оператор типа
Код

insert into table_blob (column_blob) values (0x1265acf6209fa)

ну или
Код

insert into table_blob (column_blob) values (convert('a3d43e0fcb' as binary))

в зависимости от СУБД...
Oracle не позволяет использовать в операторе вставки строковый литерал длиной более 4000 символов, и поэтому для больших объёмов данных я решил делать примерно следующее:
разбиваю свой массив байтов на блоки по 4000 и...
Код

declare
bb blob;
begin
dbms_lob.createtemporary(bb, true); 
dbms_lob.open(bb, dbms_lob.lob_readwrite); 

dbms_lob.append(bb, hextoraw('afafafaf')); //здесь по 4000 символов 
dbms_lob.append(bb, hextoraw('afafafaf'));
dbms_lob.append(bb, hextoraw('afafafaf'));
dbms_lob.append(bb, hextoraw('afafafaf'));
dbms_lob.append(bb, hextoraw('afafafaf'));
dbms_lob.append(bb, hextoraw('afafafaf'));

insert into table_blob (column_blob) values (bb);
end;


... что приведет к потере призводительности
не можете подсказать более элегантный способ решения, желательно с примером кода, повторяю, ведь я совсем ламер
... или хотя бы можно как то не использовать временную переменную?
PM MAIL ICQ   Вверх
Sqlninja
Дата 2.9.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: 13
Всего: 13



данные выгружайте в файл а потом загружайте в Oracle через sql*loader


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
charodej
Дата 2.9.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.3.2008
Где: Тула

Репутация: нет
Всего: нет



дело в том, что сформировать нужно полностью рабочий скрипт, и данные выгружать в файл тоже в скрипте, и оператор записи в файл я думаю тоже не позволит вставить данные больше 4000 символов...
по сути это использование лишь другого временного хранилища данных : файл вместо переменной , или Вы имели в виду что то другое?
PM MAIL ICQ   Вверх
LSD
Дата 2.9.2008, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15717
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 537



SQL*Loader поддерживает работу с LOB. Почитай тут.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
charodej
Дата 2.9.2008, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.3.2008
Где: Тула

Репутация: нет
Всего: нет



Цитата

SQL*Loader поддерживает работу с LOB. Почитай тут. 

замечательный инструмент, но дело - то в том, что смысл программы - создать скрипт для вставки в базу данных, а потом спросить пользователя - хотите выполнить сейчас?
если бы он всегда говорил: "Yes, of course", тогда можно было бы использовать сохранение в файл, а потом загрузку...
А ну как он ответит, "Нет, погоди, я ещё пятку не почесал, скрипт я пока сохраню, а выполню потом", данные для вставки то мы имеем только во время работы программы...
PM MAIL ICQ   Вверх
charodej
Дата 3.9.2008, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.3.2008
Где: Тула

Репутация: нет
Всего: нет



И в продолжение темы хотелось бы спросить вот что:

если для поля типа clob для решения этой же проблемы можно использовать операции типа
Код

insert into table_clob (column_clob) values ('Мама мыла раму'); // здесь по 4000 символов
update table_clob set column_clob = column_clob || 'Раму мыла мама';
update table_clob set column_clob = column_clob || 'Мыла раму мама';
...

имеется ли в Oracle механизм, позвляющий каким-либо образом добавить(обновить) данные в поле типа blob не используя временную переменную, то есть не так:
Код

declare 
lob_1 b;
begin
dbms_lob.createtemporary(lob_1, true);
dbms_lob.open(lob_1, dbms_lob.lob_readwrite);
dbms_lob.append(lob_1, hextoraw('aaaaaaaaaaaaaffffff'));
dbms_lob.append(lob_1, hextoraw('fffffffffffffffffffffffffff'));
insert into table_blob (column_blob) values (lob_1);
end;

а напрямую с базой данных...
Ведь если в базе лежит blob на 1 Гб и я хочу его обновить на 1 килобайт, мне что считывать его из базы обязательно?
PM MAIL ICQ   Вверх
LSD
Дата 4.9.2008, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15717
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 537



Цитата(charodej @  2.9.2008,  14:52 Найти цитируемый пост)
если бы он всегда говорил: "Yes, of course", тогда можно было бы использовать сохранение в файл, а потом загрузку...
А ну как он ответит, "Нет, погоди, я ещё пятку не почесал, скрипт я пока сохраню, а выполню потом", данные для вставки то мы имеем только во время работы программы... 

Почему пользователь обязательно должен выполнять SQL скрипт? Пусть используют файл с данными для SQL*Loader-а, какая им разница.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
charodej
Дата 8.9.2008, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.3.2008
Где: Тула

Репутация: нет
Всего: нет



Цитата(LSD @  4.9.2008,  18:15 Найти цитируемый пост)
Почему пользователь обязательно должен выполнять SQL скрипт? Пусть используют файл с данными для SQL*Loader-а, какая им разница. 

Да, так можно, просто в самой программе классы были заточены на генерацию скрипта, а потом последовательное считывание команд из скрипта и отправку на сервер, кроме того команды могут быть не только вставки, но и выборочного удаления и обновления записей, а loader этого сделать не может...
Вобщем в итоге делаю так:
1. Команды удаления(не всех, а определенных строк) делаю в скрипте
2. Команды обновления делаю так: создаю временную таблицу, sqlloader-om заливаю туда записи, которые нужно обновить, потом обновляю примерно так: 
Код

update t_blob set file_name = (select....из временной таблицы)

3. Команды вставки выполняю sqlloader-om 

Геморно конечно, ну другого выхода пока не вижу...

Возникают дополнительные подводные камни:
1. Записи удаляются в скрипте, а потом в sqlloader - e может произойти ошибка, из за чего новые не вставятся, и мы теряем данные,
поэтому видимо придется перед каждым выполнением делать бэкап
2. Я не нашел в документации по loader-y параметров, позволяющих отключить ограничения типа внешних ключей, индексов и т.д.
а программа должна позволять это делать(да ещё и потом пытаться включить) в скрипте это сделать можно, а при работе с loader - om видимо никак((

P.S. Sqlninja, LSD, идея в целом была хорошая, большое спасибо

Это сообщение отредактировал(а) charodej - 8.9.2008, 09:36
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0917 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.