请问Oracle触发器的问题(高分)

有两个表:
PreData: 数据表
(AddressID, Name...)

AppTreePre: 分类表
(AddressID,ClassID)

写了一个触发器:

CREATE OR REPLACE TRIGGER "SR"."TRG_APPTREEPRE_DELETE" BEFORE
DELETE ON "APPTREEPRE"
FOR EACH ROW
declare ii Number(10);AdrID Number(10);
BEGIN
AdrID:=:OLD.AddressID;
Select Count(AddressID) into ii from sr.appTreePre Where ADDRESSID=AdrID;
if ii = 1 then
Update Predata set IsClassified = 0 Where ADDRESSID=AdrID;
end if;
END;

预计在删除分类表AppTreePre表中一条记录后,如果相应的PreData表中没有在分类表中有记录的话,就将PreData中的某个字段(IsClassified)置为空。

可是现在编译通过后使用出现问题:

sr.apptreepre发生了变化,触发器/函数不能读,就是select那一行,出的问题,请大家看一下为什么。
---------------------------------------------------------------

不要用行级触发器

CREATE OR REPLACE TRIGGER TRG_APPTREEPRE_DELETE
After DELETE ON APPTREEPRE
BEGIN
Update Predata X
SET IsClassified = 0
Where not exists (select 'x'
from apptreepre
where AddressID = x.ADDRESSID);
END;
---------------------------------------------------------------

用包中的变量或者临时表都可以,用临时表效率应该更好一点
create global temporary table tmpTable
(AddressID varchar2(10))
on commit delete rows
/

CREATE OR REPLACE TRIGGER TRG_APPTREEPRE_DELETE_For_Each_Row
Before DELETE ON APPTREEPRE
For Each Row
BEGIN
insert into tmpTable (AddressID)
values (:old.AddressID);
END;
/

CREATE OR REPLACE TRIGGER TRG_APPTREEPRE_DELETE
After DELETE ON APPTREEPRE
BEGIN
Update Predata X
SET IsClassified = 0
Where AddressID in (Select AddressID from tmpTable)
and not exists (select 'x'
from apptreepre
where AddressID = x.ADDRESSID);
END;
/

Published At
Categories with 数据库类
comments powered by Disqus