oracle 臨時表 解決 "表 *** 發生了變化,觸發器/函式不能讀"的問題

悠悠隱於市發表於2011-02-24
  oracle 臨時表 解決 "表 *** 發生了變化,觸發器/函式不能讀"的問題.
行級的觸發器程式碼中不能操作該表,包括select,所以報錯! 

當然解決方法就是要根據原因了,正因為限定了行級觸發器的操作,只能選擇表級的觸發器了,但是在表級的觸發器又不能獲得:new和:old的值,那就只能採取兩種觸發器並用的方法了,並且還要包或者臨時表加以輔助.

首先在行級觸發器中將所需的,:new或者:old的值,寫到包或者臨時表中

然後在表級觸發器中處理包或者臨時表中已經寫入的資料,操作成功後可以按照需求再刪除臨時表的資料.

下面是一個例項:

-- 建立一個臨時表
create global temporary table TEMP_TEMP
(
NOTICEID NUMBER(10),
VERSION NUMBER(10)
)
on commit preserve rows;

--儲存過程
create or replace trigger savetempvalue
after insert or delete on notice_comment_data 
for each row
begin
insert into temp_temp values(:new.noticeId,:new.version);
end savetempvalue;

--主儲存過程
create or replace trigger UpdateReplyCount
after insert or delete on notice_comment_data 

declare
t_noticeId notice_comment_data.noticeid%type;
t_version notice_comment_data.version%type; 
begin
select noticeId,version into t_noticeId,t_version from temp_temp;
update notice_data 
set replyCount=(select count(*) from notice_comment_data 
where notice_comment_data.noticeid=t_noticeId and version=t_version ) 
where notice_data.noticeid=t_noticeId 
AND notice_data.version=t_version;
end UpdateReplyCount;



本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/onisland/archive/2010/09/06/5865622.aspx

 

相關文章