【问题标题】:Create trigger to insert column depending on value of other column根据其他列的值创建触发器以插入列
【发布时间】:2021-04-16 14:12:19
【问题描述】:

我想根据同一张表中另一列的值向列中插入一个值。

为此,我创建了以下触发器:

 create or replace TRIGGER INSERT_COLUMN2_TBL1
 BEFORE INSERT OR UPDATE ON TBL1
  FOR EACH ROW
begin
:new.column1 := CASE 
  when :new.column1 LIKE 'REQUESTED' then 
  INSERT INTO tbl1 (column2)
  VALUES ('REQUEST_PENDING');
  when :new.column1 LIKE 'NOT_REQUESTED' then
  INSERT INTO tbl1 (column2)
  VALUES ('TEXT123');
end;

我收到以下错误:

PLS-00103: Encountered the symbol "INSERT" when expecting one of the following: ( - + case mod new not null <an identifier> <a double-quoted delimited-identifier> <a bind variable> continue
PLS-00103: Encountered the symbol "ELSE"

我不确定如何引用我尝试触发触发器的同一个表中的列。可以这样完成还是有更好的方法?

【问题讨论】:

    标签: oracle triggers apex


    【解决方案1】:

    您不能在tbl1 的触发器中插入tbl1。在任何情况下,您似乎都不太可能想要创建一个新行。我的猜测是您确实想为当前行设置 column2 值。

    if :new.column1 = 'REQUESTED'
    then 
      :new.column2 := 'REQUEST_PENDING';
    else
      :new.column2 := 'TEXT123';
    end if;
    

    当然,如果您在insert or update 上执行此操作,这强烈暗示将column2 列放在首位是没有意义的,因为该值始终可以从column1 值导出。

    【讨论】:

    • 我想检查该列的几种情况,因此触发器必须涉及多个 elseifs if :new.column1 = 'REQUESTED' then :new.column2 := 'REQUEST_PENDING'; elseif if :new.column1 = 'NOT_REQUESTED' :new.column2 := 'TEXT123';如果结束;
    • @gisnow - 好的。这不在您的问题中,但看起来您了解如何扩展 if 语句。考虑到触发器的定义方式,这里首先使用column2 似乎仍然违反了基本规范化。
    • 也许更好的问题是如何根据同一个表中的另一列填充一个列值。我真的应该为此使用触发器吗?
    • @gisnow - 您是否应该为此使用另一列。如果您使用一些初始值填充新列并且随后允许更改,这可能表明 column2 作为单独的列是有意义的。
    猜你喜欢
    • 2021-07-15
    • 2013-07-25
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2023-01-24
    相关资源
    最近更新 更多