【问题标题】:Insert "variable from update" using Triggers in PL/SQL在 PL/SQL 中使用触发器插入“更新变量”
【发布时间】:2018-10-03 19:11:00
【问题描述】:

我有一张这样的桌子:

create table person(
id_person number(5),
city varchar(20)
);

insert into person values (1, 'NY');
insert into person values (2, 'Los Angeles');

我想将“人”动作注册到一个新表中:

create table move_city(
new_location varchar(200)
);

我有一个触发器来执行此操作:

create or replace trigger person_movement
after update of city on person
for each row
begin
insert into move_city values('The person has moved from ' ||:old.city|| ' to ' || :new.city);
end;
/

并且正在按预期工作。

如果我这样做:

update person set city='Boston' where id_person=1;

我在 move_city: '此人已从纽约搬到波士顿'

我的问题是我想将“id_person”放入“move_city”并获得类似“id 的人....已从纽约搬到波士顿”之类的信息,但我不知道我必须做什么在我的触发器中执行。

我的意思是在触发器上是这样的。

insert into move_city values('The person with ' ||id_person|| ' has moved from ' ||:old.city|| ' to ' || :new.city);

但它不起作用。

有什么建议吗?

更新:

我试过了:

create or replace trigger person_movement
after update of city on person
for each row
declare
id2 person.id_person%type;
begin
select id_person into id2 from person where id_person=:new.id_person;
insert into move_city values('The person with ' ||id2|| ' has moved from ' ||:old.city|| ' to ' || :new.city);
end;
/   

但是当我这样做时:

update person set city='Boston' where id_person=1;

我得到:

ORA-04091:表 SYSTEM.PERSON 正在变异,触发器/函数可能看不到它

ORA-06512:在“SYSTEM.PERSON_MOVEMENT”,第 4 行

ORA-04088: 执行触发器“SYSTEM.PERSON_MOVEMENT”时出错

【问题讨论】:

    标签: sql plsql


    【解决方案1】:

    您可以在此处使用:new:old

    INSERT INTO move_city
      ( new_location )
    VALUES
      ( 'The person with ' || :new.id_person|| ' has moved from ' ||:old.city|| ' to ' || :new.city);
    

    但是,我认为对于您的 move_city 表,最好的做法是为 id_personold_locationnew_location 设置单独的列,然后在您从桌子。你可以这样做:

    INSERT INTO move_city
      ( id_person, old_location, new_location )
    VALUES
      ( :new.id_person, :old.city, :new.city );
    

    (在move_city 中有一个DATE 列也是一个好主意,默认值为SYSDATE。)

    在您的触发器中,您只能在 old.citynew.city 不同的地方插入:

    IF ( old.city != new.city OR old.city IS NULL ) THEN
        INSERT INTO move_city
          ( id_person, old_location, new_location )
        VALUES
          ( :new.id_person, :old.city, :new.city );
    END IF;
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢你的想法,但我必须照我说的去做
    • 好吧,您的问题的答案在顶部。祝你好运
    猜你喜欢
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    相关资源
    最近更新 更多