Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ORACLE触发器打印相关行_Oracle_Triggers - Fatal编程技术网

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;