Oracle 触发器 Update 不能操作本表的疑问
今天要解決一個需求,類似表A有個字段叫flag存儲的是0 or ?1 ,當一行記錄更改為1的時候,其他行同字段要變為0。
這樣的需求第一個思路想嘗試下能否用觸發器來實現
create or replace trigger tr_equiptreeweatherstation
before UPDATE
ON conf_weatherstation
FOR EACH ROW
declare
BEGINupdate conf_weatherstation w set w.isshow ='0' where w.dn !=:new.dn;
END; 當我update表的時候,提示 表 *** 發生了變化,觸發器/函數不能讀"
?
在網上查找了一些解決方法,有人說可以用自治事務的方式
即加上?pragma autonomous_transaction; 在begin 后的語句結尾加上commit;
但是不試用于我這種情況,經過分析 他們的觸發器都是insert觸發而非update。
在http://blog.csdn.net/aptweasel/article/details/1630969
介紹了一種思想:
?
原因已經很明顯了就是行級的觸發器代碼中不能操作該表,包括select,是挺郁悶的
當然解決方法就是要根據原因了,正因為限定了行級觸發器的操作,只能選擇表級的觸發器了,但是在表級的觸發器又不能獲得:new和:old的值,那就只能采取兩種觸發器并用的方法了,并且還要包或者臨時表加以輔助.
首先在行級觸發器中將所需的,:new或者:old的值,寫到包或者臨時表中
然后在表級觸發器中處理包或者臨時表中已經寫入的數據,操作成功后可以按照需求再刪除臨時表的數據.
行級觸發器的:new可以放到包中的方法
參考http://xiyang.09.blog.163.com/blog/static/598276152011113011364512/
具體如何解決以后再進行分析。 現用 存儲過程人為操作了。。。
轉載于:https://www.cnblogs.com/xinyuyuanm/archive/2013/03/30/2990538.html
總結
以上是生活随笔為你收集整理的Oracle 触发器 Update 不能操作本表的疑问的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四两棉花的下一句是什么啊?
- 下一篇: 你知道哪些关于“听力”的电影?