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

Откуда:
Сообщений: 974
Всем привет!

есть триггер(after update for each row), в котором на изменение строчки делается инсерт новой строки в протокольную таблицу (аля fgaс своими силами)

выполняемый участок кода
insert into .... (...,CONTENT_BLOB,...) 
values (....:new.CONTENT_BLOB,...);

соответственно в самой программе добавляется в таблицу строка, потом в эту строку вставляется (через odbc) blob (т.е. делается update, который вызывает срабатывание написанного выше кода)

по непонятными причинам во время update в переменной :new.blob ничего нет
(dbms_lob.getlength = 0), в результате в протокольную таблицу сваливается строка с пустым лобом

если же после этого из клиента сделать update той же строки (например, update .. set field1=field1 where .. т.е. который реально ничего не изменяет, то сработавший триггер помещает в протокольную таблицу нормальный блоб, причем работает тот же самый участок кода

может кто-нибудь подскажет, это баг оракла или я что-то не так делаю (не хочется делать лишний update)?
19 янв 05, 12:55    [1256897]     Ответить | Цитировать Сообщить модератору
 Re: update blob in trigger  [new]
Mustaine
Guest
если не ошибаюсь, то для добавления строки с blob нужно сначала добавить строку с empty_blob, а потом сделать update
19 янв 05, 13:16    [1257007]     Ответить | Цитировать Сообщить модератору
 Re: update blob in trigger  [new]
Mustaine
Guest
//вот пример из документации... 9.2.0

Example 1: Inserting a Word document into a BLOB Column using PL/SQL
The following code (steps 2-5) inserts MyResume.doc in the resume column of sam_emp table.

Create a directory object in Oracle. Here is how to create a directory object called MY_FILES which represents C:\MY_DATA directory.

You must have CREATE DIRECTORY privilege in Oracle.

create or replace directory MY_FILES as 'C:\MY_DATA';



Insert a row with empty BLOB in your table and return the locator.
Point to the Word file to be loaded from the directory created in Step 1, using the BFILE data type.
Open the file and use the locator from step 2 to insert the file.
Close the file and commit the transaction.

declare
f_lob bfile;
b_lob blob;

begin

insert into sam_emp(empno,ename,resume)
values ( 9001, 'Samir',empty_blob() )
return documents into b_lob;

f_lob := bfilename( 'MY_FILES', 'MyResume.doc' );
dbms_lob.fileopen(f_lob, dbms_lob.file_readonly);
dbms_lob.loadfromfile
( b_lob, f_lob, dbms_lob.getlength(f_lob) );
dbms_lob.fileclose(f_lob);

commit;

end;
/
19 янв 05, 13:23    [1257038]     Ответить | Цитировать Сообщить модератору
 Re: update blob in trigger  [new]
Simon
Member

Откуда:
Сообщений: 974
мне кажется что вся проблема в том, что у меня при срабатывании триггера
dbms_lob.getlength(:new.content_blob) = 0
т.е. нет там ничего, а на самом деле данные есть, так как после коммит я могу их считать

попробовал с еmpty_lob() ничего не поменялось
19 янв 05, 13:29    [1257064]     Ответить | Цитировать Сообщить модератору
 Re: update blob in trigger  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3908
Попробуй сделать to_blob(:new.CONTENT_BLOB)
--------------------------------
Автор благодарит алфавит за любезно предоставленные ему буквы.
19 янв 05, 13:37    [1257101]     Ответить | Цитировать Сообщить модератору
 Re: update blob in trigger  [new]
Simon
Member

Откуда:
Сообщений: 974
to_blob не помогает при компиляции пишет ошибку

Error: PL/SQL: ORA-00932: inconsistent datatypes: expected BINARY got BLOB
19 янв 05, 13:58    [1257213]     Ответить | Цитировать Сообщить модератору
 Re: update blob in trigger  [new]
Mustaine
Guest
из документации...

For a table on which you have defined a DML trigger, if you use OCI functions or DBMS_LOB routines to change the value of a LOB column or the LOB attribute of an object type column, Oracle does not fire the DML trigger.

а также...


Trigger Restrictions on LONG and LONG RAW Datatypes
LONG and LONG RAW datatypes in triggers are subject to the following restrictions:

A SQL statement within a trigger can insert data into a column of LONG or LONG RAW datatype.
If data from a LONG or LONG RAW column can be converted to a constrained datatype (such as CHAR and VARCHAR2), then a LONG or LONG RAW column can be referenced in a SQL statement within a trigger. The maximum length for these datatypes is 32000 bytes.
Variables cannot be declared using the LONG or LONG RAW datatypes.
:NEW and :PARENT cannot be used with LONG or LONG RAW columns.
19 янв 05, 14:02    [1257237]     Ответить | Цитировать Сообщить модератору
 Re: update blob in trigger  [new]
Simon
Member

Откуда:
Сообщений: 974
но триггер то срабатывает!!!

в качестве клиента юзается акцес и используется методом adodb.recordset.AppendChunk
а потом adodb.recordset.update

видно действительно придется делать лишний update
спасибо за помощь
19 янв 05, 14:19    [1257317]     Ответить | Цитировать Сообщить модератору
 Re: update blob in trigger  [new]
Stax
Guest
2 Simon
если есть рк в after уровня оператора перечитать и
записать в аудит не пробовали,
должно работать

ЗЫ
можно по rowid попытаться перечитать блоб,
правда сам не пробовал
19 янв 05, 15:44    [1257756]     Ответить | Цитировать Сообщить модератору
 Re: update blob in trigger  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3908
Simon
to_blob не помогает при компиляции пишет ошибку

Error: PL/SQL: ORA-00932: inconsistent datatypes: expected BINARY got BLOB

Так у тя clob или blob? Ну тогда to_clob().
19 янв 05, 16:06    [1257868]     Ответить | Цитировать Сообщить модератору
 Re: update blob in trigger  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3908
Apex
Simon
to_blob не помогает при компиляции пишет ошибку

Error: PL/SQL: ORA-00932: inconsistent datatypes: expected BINARY got BLOB

Так у тя clob или blob? Ну тогда to_clob().

Сорри, невнимателно прочел вопрос...
19 янв 05, 16:10    [1257887]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: update blob in trigger  [new]
chavchipav
Member

Откуда:
Сообщений: 11
столкнулся с похожей проблемой: в среде разроботки Toad for Oracle, пытаюсь обновить поле с типом BLOB. есть триггер, который потом переливает это поле в другую таблицу.
если выполнить апдейт через statement (update my_table set blob_field = ...), то в триггере длина нового блоба ненулевая (dbms_lob.getlength(:new.blob_field) > 0), но если изменяю тело BLOBa через data grid (двойной клик по полю в строке, затем открывается "Blob editor", затем выбираю любой файл непустой и загружаю, то в том же триггере почему-то dbms_lob.getlength = 0, но из таблицы могу скачать блобик и там есть открываемое непустое содержимое)
5 фев 19, 14:39    [21801957]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить