在插入 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
我正在 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