我試圖按照指示在Mutating Table Compound Trigger更新基於一個子表的id父表和避免變異表錯誤。試圖解決變異表的問題與複合觸發器
我需要獲得在BLATChildren表中當前記錄的父ID(BLATranscriptId),然後後子記錄完成的更新,我需要提取符合我的條件的當前計數和執行更新在父表BLATranscript上。
這個錯誤已經解決了 - 我得到一個錯誤,我的綁定變量「transcriptID」在我的代碼的「AFTER EACH ROW」部分中不好。我已驗證BLATChildren.BLATranscriptId是否存在,拼寫是否正確。 解決方案是改變每行後發言之後。
NEW ISSUE - 觸發器更新父表中的每條記錄,而不僅僅是匹配的父記錄。
任何幫助將不勝感激。謝謝。
CREATE OR REPLACE TRIGGER transcript_after_update
FOR UPDATE of enrollmentStatus,completionDate on blatChildren
COMPOUND TRIGGER
transcriptID number:=0;
BEFORE EACH ROW IS
BEGIN
transcriptID := :new.blaTranscriptid;
END BEFORE EACH ROW;
AFTER STATEMENT IS
BEGIN
update BLATranscript SET (enrollmentStatus, completionDate) = (select 'C',sysdate from dual)
where id in (select blat.id from BLATranscript blat
inner join BlendedActivity bla on blat.blendedactivityid=bla.id
where blat.id=transcriptID and minCompletion<=(
select count(countForCompletion) as total from blatChildren blac
inner join BlendedActivityMembership bam on blac.childActivityId=bam.childActivityId
where completionDate>=sysdate-acceptPrevWork
and blat.id=transcriptID
and blac.enrollmentStatus='C'));
END AFTER STATEMENT;
END;
/
不能引用在其上觸發器在觸發任何行級部分定義的表。您需要在觸發器的聲明級別部分執行此操作。幾乎可以確定你想要你的局部變量是一個集合,而不是一個標量,並希望您的觸發器的語句級部分遍歷集合中的元素。您在觸發器語句級部分中對局部變量的引用不會以冒號開頭。只需使用'transcriptID'而不是':transcriptID'(或任何你命名你的集合)。 –
@sstan - 謝謝。這解決了BIND變量問題,但現在它給我一個關於我試圖避免的變異表問題的問題。 – Trebor
@JustinCave - 謝謝。我通過集合假設你正在考慮更接近文檔使用臨時表的東西嗎?我有一個心理障礙,因爲對我來說,每次更新子記錄時,它都會更新父表中的每條記錄。我顯然不是很瞭解這一點。 – Trebor