我的同事和我正在尝试在PL / SQL中编写一个数据库触发器,它可以查看映射表以查找另一个表中的特定列的ID(下面包含的示例表),然后更新该列中的值
我们需要能够以BEFORE EACH ROW触发器的方式执行此操作,以便在将数据提交到数据库之前对其进行修改。
我们最终写了一篇大规模的CASE声明来处理这个问题,但有没有人知道处理这种情况的更好方法呢?在我们的现实生活中,我们还有70列要查看,而不是8,如下例所示。
create table test_basis (
id number(22,0) not null,
item_1 number(22,0) not null,
item_2 number(22,0) not null,
item_3 number(22,0) not null,
item_4 number(22,0) not null,
item_5 number(22,0) not null,
item_6 number(22,0) not null,
item_7 number(22,0) not null,
item_8 number(22,0) not null
)
create table basis_mapping (
column_id number(22,0),
column_name varchar2(35)
)
insert into basis_mapping(1, 'Company');
insert into basis_mapping(2, 'Account');
insert into basis_mapping(3, 'Manager');
insert into basis_mapping(4, 'User');
出于我们的目的,我们需要根据column_name从basis_mapping中查找column_id,然后更新当前行中的:new.item _ ###字段。因此,如果我们想要更改“用户”列中的值,我们将运行以下语句
select column_id
into l_basis_id
from basis_mapping
where column_name = 'User'
现在我们在l_basis_id变量中有4个,我们如何使用它来生成如下语句?
:new.item_4 = 0
答案 0 :(得分:0)
不幸的是,您无法在动态SQL中引用:new
和:old
。请查看Oracle PL/SQL: Loop Over Trigger Columns Dynamically。