久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

關(guān)于ORA-04091異常的出現(xiàn)原因分析及解決方案

瀏覽:3日期:2023-05-30 16:13:45
目錄
  • 1、異常出現(xiàn)的場景.
  • 2、問題分析
  • 3、解決方案

1、異常出現(xiàn)的場景.

:在使用Hibernate做為項(xiàng)目持久層的情況下,需要對(duì)某一張表進(jìn)行一個(gè)擴(kuò)展,擴(kuò)展操作便是在該表上創(chuàng)建一個(gè)觸發(fā)器。將表中的數(shù)據(jù)讀入到其他表中。

-4091,ORA-04091: 表 DD123.DO_TABLE_47 發(fā)生了變化, 觸發(fā)器/函數(shù)不能讀它

SQL語句如下:

Sql代碼

drop table tr_table;
create table tr_table( --觸發(fā)器作用表
tab_id number primary key,
tab_name varchar2(30) NOT NULL
)
create table ts_table as select * from tr_table; --提供擴(kuò)展功能的表
--定義的觸發(fā)器,在tr_table表插入和更新數(shù)據(jù)之后向ts_table表插入當(dāng)前操作的信息行。
create trigger iu_table
after insert or update on tr_table
for each row
begin
insert into ts_table select * from tr_table t where t.tab_id = :new.tab_id;
end is_table;
--對(duì)tr_table執(zhí)行插入操作,觸發(fā)ts_table插入操作
insert into tr_table(tab_id,tab_name) values(1,"test");
--彈出錯(cuò)誤信息提示
--ORA-04091:表tr_table發(fā)生了變化 觸發(fā)器/函數(shù)不能讀它
--ORA-06512: 在iu_table line 2
--ORA-04088: 觸發(fā)器iu_table 執(zhí)行過程中出錯(cuò)

2、問題分析

:在Oracle中執(zhí)行DML語句的時(shí)候是需要顯示進(jìn)行提交操作的。當(dāng)我們進(jìn)行插入的時(shí)候,會(huì)觸發(fā)觸發(fā)器執(zhí)行對(duì)觸發(fā)器作用表和擴(kuò)展表的種種操作,但是這個(gè)時(shí)候觸發(fā)器和插入語句是在同一個(gè)事務(wù)管理中的,因此在插入語句沒有被提交的情況下,我們無法對(duì)觸發(fā)器作用表進(jìn)行其他額外的操作。如果執(zhí)行其他額外的操作則會(huì)拋出如上異常信息。

3、解決方案

:1,我們知道,出錯(cuò)的原因是因?yàn)橛|發(fā)器和DML語句在同一事務(wù)管理中,所以方案一便是將觸發(fā)器和DML語句分成兩個(gè)單獨(dú)的事務(wù)處理。這里可以使用Pragma autonomous_transaction; 告訴Oracle觸發(fā)器是自定義事務(wù)處理。

SQL語句如下:

Sql代碼

create trigger iu_table
after insert or update on tr_table
for each row
declare --這里是關(guān)鍵的地方,在變量申明的地方,指定自定義事務(wù)處理。
pragma autonomous_transaction;
begin
insert into ts_table select * from tr_table t where t.tab_id = :new.tab_id;
--這里需要顯示提交事務(wù)
commit;
end iu_table;
 create trigger iu_table
		after insert or update on tr_table
		for each row
		declare  --這里是關(guān)鍵的地方,在變量申明的地方,指定自定義事務(wù)處理。
		pragma autonomous_transaction; 
		begin
			insert into ts_table select * from tr_table t where t.tab_id = :new.tab_id;
		--這里需要顯示提交事務(wù)
			commit;
		end iu_table;

:2,在Oracle Trigger中有:new,:old兩個(gè)特殊變量,當(dāng)觸發(fā)器為行級(jí)觸發(fā)器的時(shí)候,觸發(fā)器就會(huì)提供new和old兩個(gè)保存臨時(shí)行數(shù)據(jù)的特殊變量,我們可以從倆個(gè)特殊的變量中取出數(shù)據(jù)執(zhí)行擴(kuò)張表的DML操作。

SQL語句如下:

create trigger iu_table
after insert on tr_table
for each row
begin
insert into ts_table(tab_id,tab_name) values(:new.tab_id,:new.tab_name);
--這里需要注意,要知道不同的觸發(fā)類型其特殊變量:new和:old保存的值的區(qū)別。
--commit; 注意使用方案二,這里不能顯示的進(jìn)行提交操作操作,trigger中在沒有聲明自定義事務(wù)管理的時(shí)候,不能執(zhí)行顯示提交。
end iu_table;   

到此這篇關(guān)于關(guān)于ORA-04091異常的出現(xiàn)原因,以及解決方案的文章就介紹到這了,更多相關(guān)ORA-04091異常內(nèi)容請(qǐng)搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

標(biāo)簽: Oracle
主站蜘蛛池模板: 欧美午夜寂寞影院 | 久久成人精品视频 | 99免费在线观看视频 | 北条麻妃99精品青青久久主播 | 成人在线黄色 | 羞羞视频网站在线免费观看 | 最新av片 | 成人性大片免费观看网站 | 黄色片在线免费观看 | 欧美精品片 | 欧美一级特黄aaaaaaa在线观看 | 亚洲毛片在线观看 | 国产一区二区视频在线观看 | 成年无码av片在线 | 日韩一区二区三区在线观看 | 91麻豆产精品久久久久久 | 久久久精品国产 | 欧美区国产| 久久久久国产精品一区二区三区 | 欧美精品一区在线 | 久久国产精品一区二区 | 日韩在线免费视频 | 天天综合网91 | 日韩资源在线 | 亚洲一区 中文字幕 | 亚洲日韩欧美一区二区在线 | 欧美成人激情 | 日韩精品无码一区二区三区 | 欧美淫视频 | 欧美精品 在线观看 | 伊人热久久婷婷 | 亚洲在线一区二区 | 精品久久一二三区 | 欧美一级在线 | 日韩国产欧美一区 | 欧美在线综合 | 久久三区 | 欧美在线综合 | 国产91成人video | 国产婷婷在线视频 | 欧美一区二区三区四区五区 |