插入触发后

时间:2015-10-28 07:54:00

标签: sql oracle plsql triggers

我正在尝试执行一个触发器,在insert语句之后将一些插入到列中。例如,我有一个列有列的表:

Column1 Column2 Column3

我正在将数据插入第1列,插入表(Column1)值('256234','234234')。 现在我想自动插入到COlumn2 TImestamp和Column3 Value“Y”中,所以输出应该看起来:

Column1 Column2            Column3
256234  2015-10-28 08:48   Y
234234  2015-10-28 08:48   Y

伙计们,你能帮帮我吗?我试图使用光标

最后我得到了类似的东西:

create or replace trigger name
    after insert on table
declare
  c1 sys_refcursor;
  idx varchar2(200);
begin
open c1 for select Column1 from table ;
loop
       fetch c1 into idx;
       exit when c1%NOTFOUND;
       update table a1 set a1.Column2 = (select to_char(sysdate,'YYYYMMDDHHMISS') from dual) where Column1=idx;
       update table a1 set a1.Column3 = (select 'Y' from dual) where Column1=idx;
end loop;
close c1;
end;

它工作正常,但我想知道是否还有其他更好的解决方案呢?

2 个答案:

答案 0 :(得分:4)

无需游标甚至更新:

create or replace trigger name
    before insert on table_x
begin
   :new.column2 := sysdate;
   :new.column3 := 'Y';
end;
/

但是你需要before触发器,因为after触发器无法修改新插入的行。

但为什么不直接为这些列定义默认值,那么根本不需要触发器:

create table table_x 
(
  column_1 integer, 
  column_2 date default sysdate,
  column_3 varchar(1) default 'Y'
);

答案 1 :(得分:1)

您可以创建类似的触发器:

CREATE OR REPLACE TRIGGER  "TRG_NAME" 
  BEFORE INSERT ON "TABLE_NAME"               
  FOR EACH ROW  
DECLARE

BEGIN   

        :NEW.Column2 := to_char(sysdate,'YYYYMMDDHHMISS');
        :NEW.Column3 := 'Y';


END TRG_NAME ;
/
ALTER TRIGGER  "TRG_NAME"  ENABLE; 
/

希望这个PL / SQL能帮到你..