【问题标题】:Trigger to insert Value on a column if?触发器在列上插入值,如果?
【发布时间】:2019-03-28 14:35:54
【问题描述】:

如果存在条件,我需要在表上创建一个触发器,该触发器在每次插入时更新列的值。 所以在这样的表中:

如果 "RegimeIva" = '3',我需要触发器将所有空值更新为 '1' 以获得如下结果:

我试过了:

create or replace TRIGGER AtualizaNat before INSERT ON Cabecdoc  
for each row
BEGIN
  if :new.IntrastatnatA is null and :new.intrastatnatB  is null and :new.regimeiva = '3' then
    :new.intrastatnatA : 1; :new.intrastatnatB : 1;
  else
    :new.intrastatnatA : null; :new.intrastatnatB : null; 
  end if;
END;

这不行

【问题讨论】:

  • = is null 需要改成is null:= is null; 需要改成:= null;
  • 是的,我的错!但这仍然不起作用。
  • 您只想更新插入的一行吗?如果是这样,什么不完全有效?
  • 赋值应该通过 := 而不仅仅是 : 所以它应该是 :new.intrastatnatA := 1;而不是 :new.intrastatnatA : 1;
  • 是的,只插入一行。 "消息 156,级别 15,状态 1,行 1 关键字 'or' 附近的语法不正确。

标签: sql oracle plsql database-trigger


【解决方案1】:

更正了代码中的一些语法错误。

这里有一个小例子。它对我来说很好用:

create table Cabecdoc (IntrastatnatA number, IntrastatnatB number, regimeiva char(1));


create or replace TRIGGER AtualizaNat before INSERT ON Cabecdoc  
for each row
BEGIN
  if :new.IntrastatnatA is null and :new.intrastatnatB  is null and :new.regimeiva = '3' then
    :new.intrastatnatA := 1; :new.intrastatnatB := 1;
  else
    :new.intrastatnatA := null; :new.intrastatnatB := null;
  end if;
END;

--inserting a row...
insert into Cabecdoc values (null, null, '3');

--...and checking
select * from Cabecdoc;


--Output:
IntrastatnatA IntrastatnatB regimeiva
1             1             3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-09
    • 2018-03-16
    • 1970-01-01
    • 2014-09-17
    • 2013-04-24
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多