暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 更新以前的记录

ASKTOM 2021-02-11
435

问题描述

你好,汤姆-
我的要求是,当记录插入到具有相同版本的测试表中时,事件后触发器将触发,我必须将is_active字段更新为 “I” 以表示以前的记录,并且最新的记录将为 “a”

例如: 标识1,版本1,是 _ 活动的 'A'
标识2,版本2,是 _ 活动的 'A'

现在我想填充

1,1,“我”
2,1,'A'

请帮我解决这个问题

谢谢
梅耶潘

专家解答

您可以创建一个插入前触发器,根据需要更新现有行:

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论