2014-12-02 68 views
-1

我有一個觸發器,目的是檢查新插入的行的活動,並在活動已在表中時打印出消息。該消息打印添加的新行以及已經具有該行爲的行。我能夠打印行,並有重複,但無法弄清楚如何初始化重複行的值,然後打印。ORACLE觸發打印相關行

觸發:

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; 

我知道了「其他」變量是錯的,他們是那種佔位,直到我可以計算出如何正確做到這一點。謝謝。

+0

怎麼會在併發插入的情況下表現?不,嚴肅地說,使用'UNIQUE'索引是否真的沒有辦法做到這一點? – 2014-12-02 21:49:40

+0

tbh它的一個類,並不需要完整的邏輯,只需要做我所要求的。然而我明白你在說什麼。 – user3587186 2014-12-02 21:52:56

回答

0

假設你活動的「獨特性」:

select Count(*),max(name),max(minutes) 
into n, otherName, otherMinute 
from ACTIVITIES 
where Activity = :NEW.Activity; -- <-- is this an unique key ??? 

使用聚合函數MAX將讓你在同一時間比計數查詢您的列。

您可以使用GROUP BY子句而不是使用聚合函數。我不知道哪一個會是最好的。

如果您的活動是而不是唯一,則如果您想記錄所有「重複項」,則必須遍歷遊標。


然而,正如我在評論說,這可能不是你的「相同」活動的同時插入的情況下,預計它的行爲。在這種情況下,很可能(取決於您的隔離級別)兩個插入都會被執行,而不會檢測到「重複」。

+0

爲這個任務的目的,這完美的作品,謝謝。我知道有一個簡單的方法來「分配」這些變量,但無法想到它,謝謝。 – user3587186 2014-12-02 22:21:50

0

也許我收到了你的問題錯了,但你只是意味着

select * 
from ACTIVITIES 
where Activity = :NEW.Activity 
    and rowid!=:new.rowid;