Hi all,
I've created the following objects in Oracle DB 10.2.0.3.0:
CREATE TABLE TAB1
(
ID NUMBER PRIMARY KEY,
EDITED_AT DATE,
VALUE VARCHAR2(64)
);
CREATE SEQUENCE S_TAB1
INCREMENT BY 1
START WITH 1;
CREATE TRIGGER T_TAB1_BIE
BEFORE INSERT OR UPDATE ON TAB1
FOR EACH ROW
BEGIN
IF INSERTING THEN
SELECT S_TAB1.NEXTVAL INTO :NEW.ID FROM DUAL;
END IF;
:NEW.EDITED_AT := SYSDATE;
END;
/
Then I tried to do the following in SQL Plus:
SQL> insert into tab1(value) values('ddd');
1 row created.
SQL> commit;
Commit complete.
SQL>
SQL> select * from tab1;
ID EDITED_AT VALUE
---------- ------------------- ----------------------------------------------------------------
1 27.03.2008 17:01:24 ddd
SQL>
SQL> declare dt date; val varchar2(64);
2 begin update tab1 set value = 'ddd' where id = 1 returning edited_at, value into dt, val;
3 dbms_output.put_line('txt = ' || dt || ', ' || val);
4 end;
5 /
txt = 27.03.2008 17:01:24, ddd
PL/SQL procedure successfully completed.
SQL>
SQL> select * from tab1;
ID EDITED_AT VALUE
---------- ------------------- ----------------------------------------------------------------
1 27.03.2008 17:02:12 ddd
SQL>
As it can be seen Returning clause of an Update statement does not return a new date, i.e. 27.03.2008 17:02:12, that was updated by the trigger, it returns an old one - 27.03.2008 17:01:24. Please advise me why Database returns an old value? I do believe that UPDATE ... RETURNING ... statement should return new, generated by the trigger, value.
Thanks in advance.
Regards,
Yerzhan.