Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Mailing Lists -> Oracle-L -> changing lobs with select for update and dbms_lob.write - no triggers are fired?
I have a table containing a LOB. The LOB is being changed by doing a "select for update" and a "dbms_lob.write" in PL/SQL. I notice that the value of the LOB is changed but no trigger is fired. Any ideas on how to track the LOB change through a trigger or some other mechanism? I tried this in Oracle 8.0, 8.1, 9.2, 10.1: same behaviour in every version.
I think it's counter-intuitive that you could change a database column after a "select for update" but without an update command.
See below for script and sample run.
sample run:
SQL> drop table t ;
Table supprimée.
SQL> create table t (n number, c clob) ;
Table créée.
SQL> insert into t (n, c) values (1, 'ABC') ;
1 ligne créée.
SQL> commit ;
Validation effectuée.
SQL> create trigger t_b4d
2 before delete on t
3 begin
4 dbms_output.put_line ('*************') ; 5 dbms_output.put_line (' delete on T') ; 6 dbms_output.put_line ('*************') ;7 end ;
4 dbms_output.put_line ('*************') ; 5 dbms_output.put_line (' insert on T') ; 6 dbms_output.put_line ('*************') ;7 end ;
4 dbms_output.put_line ('*************') ; 5 dbms_output.put_line (' update on T') ; 6 dbms_output.put_line ('*************') ;7 end ;
5 dbms_output.put_line ('+++++++++++++') ; 6 dbms_output.put_line (' for each row trigger') ; 7 dbms_output.put_line (' delete on T') ; 8 dbms_output.put_line ('+++++++++++++') ;9 end ;
4 dbms_output.put_line ('+++++++++++++') ; 5 dbms_output.put_line (' for each row trigger') ; 6 dbms_output.put_line (' insert on T') ; 7 dbms_output.put_line ('+++++++++++++') ;8 end ;
4 dbms_output.put_line ('+++++++++++++') ; 5 dbms_output.put_line (' for each row trigger') ; 6 dbms_output.put_line (' update on T') ; 7 dbms_output.put_line ('+++++++++++++') ;8 end ;
SQL> set serveroutput on size 2000
SQL> select * from t ;
N C
--------- -------------------------------------------------------------------------------- 1 ABC
SQL> update t set c = 'ABD' where n = 1 ;
+++++++++++++
for each row trigger
update on T
+++++++++++++
SQL> select * from t ;
N C
--------- -------------------------------------------------------------------------------- 1 ABD SQL> declare 2 temp_lob clob ; 3 begin 4 select c into temp_lob 5 from t 6 where n = 1 7 for update ; 8 dbms_lob.write (lob_loc => temp_lob, 9 amount => 1, 10 offset => 3, 11 buffer => 'E') ; 12 commit ;
SQL> select * from t ;
N C
--------- -------------------------------------------------------------------------------- 1 ABE
drop table t ;
create table t (n number, c clob) ;
insert into t (n, c) values (1, 'ABC') ;
commit ;
create trigger t_b4d
before delete on t
begin
dbms_output.put_line ('*************') ; dbms_output.put_line (' delete on T') ; dbms_output.put_line ('*************') ;end ;
dbms_output.put_line ('*************') ; dbms_output.put_line (' insert on T') ; dbms_output.put_line ('*************') ;end ;
dbms_output.put_line ('*************') ; dbms_output.put_line (' update on T') ; dbms_output.put_line ('*************') ;end ;
dbms_output.put_line ('+++++++++++++') ; dbms_output.put_line (' for each row trigger') ; dbms_output.put_line (' delete on T') ; dbms_output.put_line ('+++++++++++++') ;end ;
dbms_output.put_line ('+++++++++++++') ; dbms_output.put_line (' for each row trigger') ; dbms_output.put_line (' insert on T') ; dbms_output.put_line ('+++++++++++++') ;end ;
dbms_output.put_line ('+++++++++++++') ; dbms_output.put_line (' for each row trigger') ; dbms_output.put_line (' update on T') ; dbms_output.put_line ('+++++++++++++') ;end ;
temp_lob clob ;
begin
select c into temp_lob
from t
where n = 1
for update ;
dbms_lob.write (lob_loc => temp_lob,
amount => 1, offset => 3, buffer => 'E') ;
-- http://www.freelists.org/webpage/oracle-lReceived on Thu Jun 02 2005 - 15:41:43 CDT
![]() |
![]() |