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

时间:2018-08-20 13:36:00

标签: sql oracle plsql database-trigger

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

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

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

用例是:

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

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

请帮助

2 个答案:

答案 0 :(得分:1)

一旦您创建了以下触发器:

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

答案 1 :(得分:0)

您可以在触发器: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;

在此示例中,触发器在DELETE,INSERT或UPDATE之前触发::old.sal将包含触发器触发之前的薪水,而:new.sal将包含新值。