今天幫其他專案組同事寫觸發器。
由於本人以前未接觸過觸發器,週末去書城翻翻書看了下。
現把出現的問題記錄如下。
ora-04098 觸發器無效或未通過重新驗證
此處問題主要是觸發器語法、語句寫的有問題。
如宣告變數
declareisa13
varchar2(1
);select e1307 into isa13 from usra13 where a0100 = :new.a0100;
此處 e1307 在資料庫中為 varchar2,一開始為圖簡便 把isa13 宣告為 number 型別。
查詢觸發器是否有效sql
select owner, object_name, object_type, status from dba_objects whereobject_name='
trigger_name
';
當status 為 valid時,及觸發器是正確的。
總結:ora-04098主要是語法不正確或者變數宣告賦值型別不正確等問題
ora-01403 no data found 資料未找到
當時sql如下
select e1307 into isa13 from usra13 where a0100 = :new.a0100;
看錯誤樓主就明白是啥問題。so,當時sql 修改如下
select nvl(e1307 ,3)into isa13 from usra13 where a0100 = :new.a0100;
執行之後還是報錯 ora-01403,囧了~,上網搜之
先給出幫我解決問題的連線:
修改**如下,問題解決
beginselect e1307 into isa13 from usra13 where a0100 =
:new.a0100;
exception
when no_data_found then
isa13 :=3
;end;
今天觸發器又增加了新增,與刪除時觸發,
且新增、修改、刪除時觸發觸發器後內部邏輯都略有不同
so 又新增如下**
在oracle 觸發器中 通過 inserting updating deleting
來判斷是做什麼操作時觸發的觸發器
ifinserting then
--新增時處理
endif
;if updating then
--修改時處理
endif
;if deleting then
--刪除時處理
endif;
寫到此處,測試時發現,
當通過刪除操作來觸發觸發器時,刪除內部處理有些竟然沒有執行。。。
what? 經過排查發現問題如下
--這是刪除操作中的乙個處理
where a0100 =
:new.a0100;
--看到沒,一開始睜大眼睛竟然不知道錯誤就在自己眼前
--修改為如下
where a0100 = :old.a0100;
說明:oracle 觸發器的新舊值之分
一般觸發器觸發時,會產生乙個新值與乙個舊值 如下
新增只有新值:new , 刪除只有舊值:old 修改兩個值都有
insert
update
delete
new(新值)√√
old(舊值)√√
如此,完成觸發器之初體驗。這種事果然比整理歷史資料有成就感~哈哈!
ORACLE觸發器 行級觸發器
行級觸發器 本章介紹行級觸發器機制。大部分例子以insert出發器給出,行級觸發器可從insert update delete語句觸發。1 介紹 觸發器是儲存在資料庫已編譯的儲存過程,使用的語言是pl sql,用編寫儲存過程一樣的方式編寫和編譯觸發器。下面在sql plus會話中建立和示例乙個簡單的...
MySQL觸發器(初級體驗)
在mysql中觸發事件分為 insert update 或delete 觸發的時機有 before 觸發事件之前 或 after 觸發事件之後 我只用過after 有乙個限制是不能同時在乙個表上建立2個相同型別的觸發器,因此在乙個表上最多建立6個觸發器。例項 create trigger 觸發器名稱...
Oracle觸發器介紹 行級觸發器
行級觸發器 本章介紹行級觸發器機制。大部分例子以insert出發器給出,行級觸發器可從insert update delete語句觸發。1 介紹 觸 髮器是儲存在資料庫已編譯的儲存過程,使用的語言是pl sql,用編寫儲存過程一樣的方式編寫和編譯觸發器。下面在sql plus會話中建立和示例一 個簡...