【问题标题】:After insert Trigger插入触发器后
【发布时间】:2016-01-27 21:44:35
【问题描述】:

我正在尝试做一个触发器,在插入语句之后将一些插入到列中。例如,我有一个表格,其中的列看起来:

Column1 Column2 Column3

我将数据插入到第 1 列,插入到表(列 1)值('256234','234234')。 现在我想自动插入 COlumn2 TImestamp 和 Column3 值“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;

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

【问题讨论】:

  • 如果您要插入到您要插入的同一个表中,那么您可以使用:new.columnName 语法

标签: sql oracle plsql triggers


【解决方案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 对您有所帮助..

【讨论】:

  • Amol 非常感谢,但是我决定不使用触发器,我忘记了我可以在创建表的过程中设置默认值..
  • 当然,但是当您对同一行执行更新操作时,触发器也可以帮助您更新值。
【解决方案2】:

不需要游标甚至更新:

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'
);

【讨论】:

  • @maciek2791:date 没有“格式”,它以二进制表示形式存储。您看到的任何“格式”都由应用程序应用显示该日期。如果您想以不同的格式查看它,请在选择数据时应用to_char() 函数。并且永远不要将日期存储在 VARCHAR 列中。
猜你喜欢
  • 2016-10-13
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
  • 2015-11-06
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多