在插入 Oracle 触发器之前获取当前行的列值

Fetching a column value for current row in before insert Oracle trigger

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

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

场景是这样的: 必须使用触发器插入 column2 的值。 但是,要填充 column2 中的值,需要要插入的行中 column1 的第一个值。 并且根据 column1 的值,将计算并插入 column2 的值。 请帮我解决语法和正确的问题。

用例是:

假设column1值为TS-1 那么 column2 的值必须是 TS-1-1,下一次 column2 的值将是 TS-1-2等。因此,table 中的 TS-1 可能有多个值,并且每次 column2 的值都会随着 TS-1-、TS-1-2、TS-1-3 等增加,最后column2 的数字增加。

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

请帮忙

您可以在触发器中使用这两个术语 :old 来引用旧值,并使用 :new 来引用新值。

这是上面链接的 Oracle 文档中的示例

CREATE OR REPLACE TRIGGER Print_salary_changes   
   BEFORE DELETE OR INSERT OR UPDATE ON Emp_tab   
   FOR EACH ROW WHEN (new.Empno > 0) 
DECLARE
    sal_diff number; 
BEGIN
    sal_diff  := :new.sal  - :old.sal;
    dbms_output.put('Old salary: ' || :old.sal);
    dbms_output.put('  New salary: ' || :new.sal);
    dbms_output.put_line('  Difference ' || sal_diff); 
END;

在此示例中,触发器在删除或插入或更新之前触发:old.sal 将包含触发器触发之前的薪水,并且:new.sal 将包含新值。

创建如下触发器后:

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