原文: 劉武 | ora-04091 表XX發生了變化 觸發器/函數不能讀 的錯誤處理? ?
開發過程中碰到了 ora-04091 錯誤:表XX發生了錯誤,觸發器/函數不能讀
以下是模擬場景:
表PRODUCTS:
CREATE
TABLE
CKSP.PRODUCTS
(
ID NUMBER(1)
NOT
NULL
,
NAME
VARCHAR
2(100)
NOT
NULL
,
PRICE1 NUMBER(1)
NOT
NULL
,
PRICE2 NUMBER(1)
NOT
NULL
)
TABLESPACE USERS
NOLOGGING
PCTFREE 10
PCTUSED 0
INITRANS 1
MAXTRANS 255
STORAGE(BUFFER_POOL
DEFAULT
)
NOPARALLEL
NOCACHE
并聲明觸發器TRG_PRODUCTS_INSERT:
CREATE
OR
REPLACE
TRIGGER
TRG_PRODUCTS_INSERT
BEFORE
INSERT
ON
PRODUCTS
REFERENCING OLD
AS
OLD NEW
AS
NEW
FOR
EACH ROW
declare
varCount number;
begin
select
count
(id)
into
varCount
from
products
where
name = :new.name;
if
varCount > 0
then
varCount:= varCount +1;
:new.name :=varCount||'
_
'||:new.name;
end
if
;
end
;
若執行以下SQL則會引發ORA-04091錯誤
begin
insert
into
products
values
(1,'
p1
',1,2);
insert
into
products
select
2
as
id ,name ,price1,price2
from
products
where
id= 1;
end
;
解決方法: 修改SQL 如下
declare
varName
varchar
2(100);
varPrice1 number;
varPrice2 number;
begin
insert
into
products
values
(1,'
p1
',1,2);
select
name,price1,price2
into
varName,varPrice1,varPrice2
from
products
where
id =1;
insert
into
products
values
(2,varName,varprice1,varPrice2);
end
;
在此情形中不能使用INSERT INTO XXX SELECT .... 語句,而應使用變量來保存值
這也許只是眾多情形之一,僅供參考.
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

