有两个表:
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;
/