powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / update blob in trigger
12 сообщений из 12, страница 1 из 1
update blob in trigger
    #32872170
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

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

выполняемый участок кода
Код: plaintext
1.
2.
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)?
...
Рейтинг: 0 / 0
update blob in trigger
    #32872236
Mustaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если не ошибаюсь, то для добавления строки с blob нужно сначала добавить строку с empty_blob, а потом сделать update
...
Рейтинг: 0 / 0
update blob in trigger
    #32872253
Mustaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
//вот пример из документации... 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;
/
...
Рейтинг: 0 / 0
update blob in trigger
    #32872267
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне кажется что вся проблема в том, что у меня при срабатывании триггера
dbms_lob.getlength(:new.content_blob) = 0
т.е. нет там ничего, а на самом деле данные есть, так как после коммит я могу их считать

попробовал с еmpty_lob() ничего не поменялось
...
Рейтинг: 0 / 0
update blob in trigger
    #32872289
Фотография Apex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй сделать to_blob(:new.CONTENT_BLOB)
--------------------------------
Автор благодарит алфавит за любезно предоставленные ему буквы.
...
Рейтинг: 0 / 0
update blob in trigger
    #32872354
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to_blob не помогает при компиляции пишет ошибку

Error: PL/SQL: ORA-00932: inconsistent datatypes: expected BINARY got BLOB
...
Рейтинг: 0 / 0
update blob in trigger
    #32872370
Mustaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
из документации...

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.
...
Рейтинг: 0 / 0
update blob in trigger
    #32872413
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но триггер то срабатывает!!!

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

видно действительно придется делать лишний update
спасибо за помощь
...
Рейтинг: 0 / 0
update blob in trigger
    #32872707
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Simon
если есть рк в after уровня оператора перечитать и
записать в аудит не пробовали,
должно работать

ЗЫ
можно по rowid попытаться перечитать блоб,
правда сам не пробовал
...
Рейтинг: 0 / 0
update blob in trigger
    #32872772
Фотография Apex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Simonto_blob не помогает при компиляции пишет ошибку

Error: PL/SQL: ORA-00932: inconsistent datatypes: expected BINARY got BLOB
Так у тя clob или blob? Ну тогда to_clob().
...
Рейтинг: 0 / 0
update blob in trigger
    #32872782
Фотография Apex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Apex Simonto_blob не помогает при компиляции пишет ошибку

Error: PL/SQL: ORA-00932: inconsistent datatypes: expected BINARY got BLOB
Так у тя clob или blob? Ну тогда to_clob().
Сорри, невнимателно прочел вопрос...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
update blob in trigger
    #39769674
chavchipav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
столкнулся с похожей проблемой: в среде разроботки 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, но из таблицы могу скачать блобик и там есть открываемое непустое содержимое)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / update blob in trigger
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]