原帖位址
問題如下
表 ksource.userinfo 發生了變化, 觸發器/函式不能讀它
userinfo(userid,username,departid,serialnum,…)
對於乙個部門(departid相同)下的使用者,我要讓其序號serialnum保持連續,就建立了乙個觸發器:
引用:
create or replace trigger 「ksource」.truserinfo_insertafter
insert on 「ksource」.」userinfo」
referencing old as old new as new
for each row
declare
v_serialnum number;
begin
select count(*) into v_serialnum from userinfo where departid=:new.departid;
if (:new.serialnum v_serialnum) then
update userinfo set serialnum=v_serialnum where userid=:new.userid;
end if;
end;
解決的方式
就是這裡可以通過一些autonomous_transaction(自治事務)來解決
或者是用表級別的trigger和行級trigger搭配,行級trigger做標記,表級別的trigger來做操作。配合著package裡的臨時變數儲存標記。
一下是簡單的處理方式,自治事務
引用:
create or replace trigger 「ksource」.truserinfo_insertafter
insert on 「ksource」.」userinfo」
referencing old as old new as new
for each row
declare
v_serialnum number;
pragma autonomous_transaction;
begin
select count(*) into v_serialnum from userinfo where departid=:new.departid;
if (:new.serialnum v_serialnum) then
update userinfo set serialnum=v_serialnum where userid=:new.userid;
end if;
commit;
end;
你試試這個解決方式叻,不過對於你這case,確實比較複雜,在你delete一條中間的資料時,確實還要控制其他的serialnum也隨之發生變化。這樣才能保持連續
由於是自治形式的,所以在你的程式塊裡,最後需要加上commit;
自治事務參考
在觸發器中操作觸發此觸發器的表,用 pragma autonomous transaction 選項。自治事務理解 一般情況下利用觸發器禁止某些對錶的更新等操作時,若記錄日誌,則觸發器最後丟擲異常時會造成日誌回滾。利用自治事務可防止此點。對資料庫有寫操作 insert update delete c...
oracle的自治事務
create or replace procedure testa a varchar2,b varchar2 is vs str varchar2 10 begin insert into test table t values a vs str b testb bs str rollback e...
觸發器 事務
觸發器 業務是緊密相連的,不可分割的,可以使用觸發器 觸發器的四個要素 1.監視地點 2.監視事件 3.觸發時間 4.觸發事件 after 在之後,當我監視事件發生增刪改以後,進行觸發 before 先完成觸發,再進行增刪改。監視事件之前 建立觸發器的語法 create trigger 觸發器名稱 ...