racle 觸發器.
監聽表A 更新 更新後觸發.
其中 使用游標查詢表A 數據.
OPEN 游標時
會報 ORA-04091:表A發生了變化,觸發器/函數不能讀它
於是增加了自定義事物 pragma autonomous_transaction;
增加事物之後不報錯了.但是OPEN 的游標 沒有獲取到任何數據.
想做到的效果是
是這樣. 比如說表A裡面有4條數據
1 aaaa
2 bbbb
3 cccc
4 dddd
完後在修改其中一條數據之後. 查詢其余沒有修改的3條數據.在插入到表B中.
所以這裡我想查詢觸發器監聽的表.
我應該怎麼處理?有什麼好的建議.我剛才嘗試了一下勇士圖 依然會同樣報錯
或者參考一下這個
相信寫過ORACLE行級觸發器的IT同仁們大多遇到過ORA-04091問題,即在某表的行級觸發器中不能讀取當前表的問題,如:
create table test(id raw(16), name varchar2(100), primary key (id));
create table test_count(test_count int);
insert into test_count values(0);
commit;
create or replace trigger t_test
AFTER INSERT OR DELETE ON test
FOR EACH ROW
BEGIN
UPDATE test_count
SET test_count = (SELECT count(*) from test);
END t_test;
/
當您在插入test表時,系統會抱怨(當然計數這樣的簡單業務是不需要使用觸發器來做的,僅用於舉例):
第 1 行出現錯誤:
RA-04091: 表 TEST.TEST 發生了變化, 觸發器/函數不能讀它
RA-06512: 在 "TEST.T_TEST", line 2
RA-04088: 觸發器 'TEST.T_TEST' 執行過程中出錯
前幾天看到觸發器的INSTEAD OF子句,順便用它搞定:
drop trigger t_test;
create view v_test as select id, name from test;
create or replace trigger t_v_test
INSTEAD OF INSERT OR DELETE OR UPDATE ON v_test
FOR EACH ROW
DECLARE
BEGIN
IF inserting THEN
INSERT INTO test(id, name) values(:new.id, :new.name);
END IF;
IF deleting THEN
DELETE FROM test WHERE id = :old.id;
END IF;
IF updating THEN
UPDATE test
SET id = :new.id, name = :new.name
WHERE id = :old.id;
ELSE
UPDATE test_count
SET test_count = (SELECT count(*) from test);
END IF;
END t_v_test;
/
原來對test表的插入改為對v_test插入,一切OK,搞定。