ORACLE触发器打印相关行
我有一个触发器,其目的是检查新插入行的活动,如果活动已经在表中,则打印一条消息。该消息将打印正在添加的新行以及已包含该活动的行。我可以打印行,并且有一个重复的行,但是我不知道如何初始化重复行的值,然后打印它 触发:ORACLE触发器打印相关行,oracle,triggers,Oracle,Triggers,我有一个触发器,其目的是检查新插入行的活动,如果活动已经在表中,则打印一条消息。该消息将打印正在添加的新行以及已包含该活动的行。我可以打印行,并且有一个重复的行,但是我不知道如何初始化重复行的值,然后打印它 触发: create or replace trigger insertActivities before insert on ACTIVITIES for EACH row declare n int; otherName varchar(30); otherActivity varcha
create or replace trigger insertActivities
before insert
on ACTIVITIES
for EACH row
declare
n int;
otherName varchar(30);
otherActivity varchar(30);
otherMinutes varchar(30);
begin
select Count(*)
into n
from ACTIVITIES
where Activity = :NEW.Activity;
if n>0 then
dbms_output.put_line('Duplicate activity. New Name: ' || :NEW.Name || ' New Activity: '|| :NEW.Activity
|| ' New Minutes: '|| :NEW.Minutes || ' Other Name: ' || otherName || ' Other Activity: ' || otherActivity
|| 'Other Minutes: '|| otherMinutes);
end if;
END;
我知道“其他”变量是错误的,它们是一种占位符,直到我能找到正确的方法。谢谢。假设您的活动独一无二: 使用聚合函数MAX将允许您在计数的同时查询列 您可以使用GROUPBY子句,而不是使用聚合函数。我不知道哪一个最好 如果您的活动不是唯一的,那么如果您想记录所有重复的活动,就必须通过游标进行循环
然而,正如我在一篇评论中所说的,在同一活动的并发插入的情况下,这可能不像您预期的那样。在这种情况下,很有可能根据您的隔离级别执行两个insert,但它们都没有检测到重复项。也许我误解了您的问题,但您的意思是
select *
from ACTIVITIES
where Activity = :NEW.Activity
and rowid!=:new.rowid;
在并发插入的情况下,这将如何表现?不,说真的,使用唯一索引真的没有任何方法可以做到这一点吗?对于一个类来说,它真的不需要有完整的逻辑,只是能够按照我的要求去做。不过,我明白你的意思。出于本作业的目的,本作业非常有效,谢谢。我知道有一个简单的方法来分配这些变量,但想不起来,谢谢。
select *
from ACTIVITIES
where Activity = :NEW.Activity
and rowid!=:new.rowid;