Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 вставка массива байтов в поле типа blob  [new]
charodej
Member

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

Я только недавно начал работать с СУБД 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;

... что приведет к потере призводительности
не можете подсказать более элегантный способ решения, желательно с примером кода, повторяю, ведь я совсем ламер
... или хотя бы можно как то не использовать временную переменную?
2 сен 08, 13:16    [6136772]     Ответить | Цитировать Сообщить модератору
 Re: вставка массива байтов в поле типа blob  [new]
givanov
Member

Откуда:
Сообщений: 757
Уточните, на каком языке у вас программа написана. И какими средствами вы Oracle из этой программы вызываете.
Возможно, есть метод передачи значения параметра как lob объекта. Если передавать как строки, то Ваш способ, похоже, лучший.
2 сен 08, 13:53    [6137024]     Ответить | Цитировать Сообщить модератору
 Re: вставка массива байтов в поле типа blob  [new]
Elic
Member

Откуда:
Сообщений: 29977
charodej
... что приведет к потере призводительности
Потеря производительности - это
charodej
формирует скрипт на вставку в базу
Так что потерей больше, потерей меньше - один фиг.
2 сен 08, 13:56    [6137042]     Ответить | Цитировать Сообщить модератору
 Re: вставка массива байтов в поле типа blob  [new]
charodej
Member

Откуда:
Сообщений: 84
программа написана на C#, в качестве провайдера данных для Oracle используется OracleClient.dll
Я понимаю, что сборка предоставляет очень вкусные и удобные типы для работы с Oracle LOBs, и вставка данных - это не проблема, проблема по сути в том, что нужно сформировать именно полностью рабочий скрипт, который можно сохранить, а выполнить потом...
2 сен 08, 14:04    [6137084]     Ответить | Цитировать Сообщить модератору
 Re: вставка массива байтов в поле типа blob  [new]
charodej
Member

Откуда:
Сообщений: 84
И в продолжение темы хотелось бы спросить вот что:

если для поля типа 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 килобайт, мне что считывать его из базы обязательно?
3 сен 08, 10:41    [6140484]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить