程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> oracle-ORACLE 觸發器中 使用游標查詢 本表 報錯ORA-04091

oracle-ORACLE 觸發器中 使用游標查詢 本表 報錯ORA-04091

編輯:編程綜合問答
ORACLE 觸發器中 使用游標查詢 本表 報錯ORA-04091

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,搞定。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved