首页 > 解决方案 > 在插入Oracle触发器之前获取当前行的列值

问题描述

我在 oracle 中创建了一个触发器,该触发器在任何插入语句之前被触发。我想使用该触发器在 column2 中插入一个值,但问题是,我必须首先获取另一列的值,即第 1 列,插入的新行并基于该值,我将编写业务逻辑在 column2 中插入值。

我无法访问将要插入的新行的 column1 的值。如何访问正在插入的新行的值。

场景是这样的:必须使用触发器插入 column2 的值。但是,要在 column2 中填充值,需要从要插入的行中为 column1 提供第一个值。并根据 column1 的值,计算并插入 column2 的值。请帮助我解决语法和正确的解决方案。

用例是:

假设 column1 的值为 TS-1,那么 column2 的值必须为 TS-1-1,下一次 column2 的值将是 TS-1-2,依此类推。所以表中的 TS-1 可能有多个值,并且每次 column2 的值都会随着 TS-1-、TS-1-2、TS-1-3 等而增加,最后一位数字会增加第 2 列。

因此,我将获取最后一个数字的最大值,并为每个插入增加 1。

请帮忙

标签: sqloracleplsqldatabase-trigger

解决方案


创建如下触发器后:

SQL> create or replace trigger trg_tab_bi
  before insert on tab  
  for each row
declare
  nr int;
begin
  select count(1)+1
    into nr
    from tab
   where col1 = :new.col1;
  :new.col2 := :new.col1||'-'||nr;
end;

您可以通过以下方式管理您想要的职责:

SQL> insert into tab(col1) values('TS-1');

1 row inserted

SQL> select t.*
  2    from tab t
  3   order by col1, col2;

COL1        COL2
------      ------   
TS-1        TS-1-1

SQL> insert into tab(col1) values('TS-1');

1 row inserted

SQL> select t.*
  2    from tab t
  3   order by col1, col2;

COL1        COL2
------      ------   
TS-1        TS-1-1
TS-1        TS-1-2

SQL> insert into tab(col1) values('TS-1');

1 row inserted

SQL> select t.*
  2    from tab t
  3   order by col1, col2;

COL1        COL2
------      ------   
TS-1        TS-1-1
TS-1        TS-1-2
TS-1        TS-1-3

SQL> insert into tab(col1) values('TS-7');

1 row inserted

SQL> select t.*
  2    from tab t
  3   order by col1, col2;

COL1        COL2
------      ------   
TS-1        TS-1-1
TS-1        TS-1-2
TS-1        TS-1-3
TS-7        TS-7-1

SQL> insert into tab(col1) values('TS-7');

1 row inserted

SQL> select t.*
  2    from tab t
  3   order by col1, col2;

COL1        COL2
------      ------   
TS-1        TS-1-1
TS-1        TS-1-2
TS-1        TS-1-3
TS-7        TS-7-1
TS-7        TS-7-2

推荐阅读