我想通过触发器更新同一个表的值

时间:2018-04-19 13:01:27

标签: sql oracle plsql database-trigger

columns   data_type         nullable      default
ID        VARCHAR2(30 BYTE)   No    
PASSWORD  VARCHAR2(20 BYTE)   No    
NAME      VARCHAR2(20 BYTE)   No    
BIRTH     CHAR(11 BYTE)       No    
PHONE     VARCHAR2(11 BYTE)   No    
CBD_1     VARCHAR2(20 BYTE)   Yes   
CBD_2     VARCHAR2(20 BYTE)   Yes   
CBD_3     VARCHAR2(20 BYTE)   Yes   
CBD_4     VARCHAR2(20 BYTE)   Yes   
CBD_5     VARCHAR2(20 BYTE)   Yes   
CDATE     VARCHAR2(20 BYTE)   Yes      to_char(sysdate, 'dd-Mon-YYYY') 
UDATE     VARCHAR2(20 BYTE)   Yes      to_char(sysdate, 'dd-Mon-YYYY')

我的问题是:当我通过触发器

更新此表中的现有记录时,我想插入更新时间

这是我的代码

create or replace trigger udate
  before update or delete on member for each row
declare
  u_id varchar2(30);
begin
  u_id := :old.id;
  update member set udate = to_char(sysdate, 'dd-Mon-YYYY') where id = u_id;
end;

错误消息

One error saving changes to table "JSP"."MEMBER":
Row 6: ORA-04091: table JSP.MEMBER is mutating, trigger/function may not see 
it
ORA-06512: at "JSP.UDATE", line 5
ORA-04088: error during execution of trigger 'JSP.UDATE'

我已经尝试了:new.id,但它无效

1 个答案:

答案 0 :(得分:3)

请勿使用update,只需指定值:

create or replace trigger udate
  before update on member for each row
begin
  :new.udate := to_char(sysdate, 'dd-Mon-YYYY');
end;

在“删除之前”执行此操作没有意义,因为无论如何都会删除该行。

您应永远将DATE值存储在varchar列中。这是一个可怕的想法。不要那样做。