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

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

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

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

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

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

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

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

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

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


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