问题描述
你好,汤姆-
我的要求是,当记录插入到具有相同版本的测试表中时,事件后触发器将触发,我必须将is_active字段更新为 “I” 以表示以前的记录,并且最新的记录将为 “a”
例如: 标识1,版本1,是 _ 活动的 'A'
标识2,版本2,是 _ 活动的 'A'
现在我想填充
1,1,“我”
2,1,'A'
请帮我解决这个问题
谢谢
梅耶潘
我的要求是,当记录插入到具有相同版本的测试表中时,事件后触发器将触发,我必须将is_active字段更新为 “I” 以表示以前的记录,并且最新的记录将为 “a”
例如: 标识1,版本1,是 _ 活动的 'A'
标识2,版本2,是 _ 活动的 'A'
现在我想填充
1,1,“我”
2,1,'A'
请帮我解决这个问题
谢谢
梅耶潘
专家解答
您可以创建一个插入前触发器,根据需要更新现有行:
但是...
我会避免这种方法!
它只适用于单行插入。如果您尝试插入选择,您将点击:
有各种解决此问题的方法。但是最好创建一个API,您调用它来添加新行并更新现有行。
例如:
这更清楚; 没有 “令人惊讶” 的行为,即插入的功能超出了您的预期。
create table t (
c1 int, ins_date date, is_active varchar2(1)
);
insert into t values ( 1, sysdate, 'Y' );
commit;
create or replace trigger t_trig
before insert on t
for each row
begin
update t
set is_active = 'N'
where c1 = :new.c1
and is_active = 'Y';
end;
/
insert into t values ( 1, sysdate, 'Y' );
select * from t;
C1 INS_DATE IS_ACTIVE
1 11-FEB-2021 17:26:51 N
1 11-FEB-2021 17:26:54 Y 但是...
我会避免这种方法!
它只适用于单行插入。如果您尝试插入选择,您将点击:
insert into t select 1, sysdate, 'Y' from dual; ORA-04091: table CHRIS.T is mutating, trigger/function may not see it
有各种解决此问题的方法。但是最好创建一个API,您调用它来添加新行并更新现有行。
例如:
create or replace procedure ins_row ( v1 int ) as
begin
update t
set is_active = 'N'
where c1 = v1
and is_active = 'Y';
insert into t values ( v1, sysdate, 'Y' );
end ins_row;
/
exec ins_row ( 1 );
select * from t;
C1 INS_DATE IS_ACTIVE
1 11-FEB-2021 17:26:51 N
1 11-FEB-2021 17:26:54 N
1 11-FEB-2021 17:27:18 Y 这更清楚; 没有 “令人惊讶” 的行为,即插入的功能超出了您的预期。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




