Oracle觸發器初體驗

2022-08-10 03:24:14 字數 2015 閱讀 9005

今天幫其他專案組同事寫觸發器。

由於本人以前未接觸過觸發器,週末去書城翻翻書看了下。

現把出現的問題記錄如下。

ora-04098 觸發器無效或未通過重新驗證

此處問題主要是觸發器語法、語句寫的有問題。

如宣告變數

declare

isa13

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 where

object_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,囧了~,上網搜之

先給出幫我解決問題的連線:

修改**如下,問題解決

begin

select e1307 into isa13 from usra13 where a0100 =

:new.a0100;

exception

when no_data_found then

isa13 :=3

;end;

今天觸發器又增加了新增,與刪除時觸發,

且新增、修改、刪除時觸發觸發器後內部邏輯都略有不同

so 又新增如下**

在oracle 觸發器中 通過  inserting  updating deleting

來判斷是做什麼操作時觸發的觸發器

if

inserting 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會話中建立和示例一 個簡...