我正在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。
请帮助
答案 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将包含新值。