sql - 在插入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。
请帮忙
解决方案
创建如下触发器后:
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
推荐阅读
- javascript - 为什么输入标题中的 HTML 实体不适用于 React
- leaflet - 使用 mappa.js 和 p5.js 根据当前位置动态设置地图图块
- javascript - 获取图像的宽度和高度
- java - 在Java中使用默认说明符声明Hashmap时如何将Hashmap传递给另一个类(不同的包)
- c# - 如何在使用 Windows.Web.Http 的 UWP 应用中使用为 System.Net.Http 添加的 IdentityModel 扩展方法 (TokenRefresh)
- flutter - 电话会议就像放大颤动
- python - Python exit() 命令触发无限循环(已解决)
- python - 如何在 Gekko 中使用 apm_get?
- python - numpy(setup.py)的构建轮......错误
- angular - 如何在 observable 中等待异步函数?