我開始寫了乙個觸發器,要判斷sso_sp_list表中master_sess_id字段值與我要在sso_masters_inf
表中刪除的記錄的master_sess_id字段值相等的記錄是否為空,我select了該記錄的master_sess_id欄位,放入變數v(欄位master_sess_id型別),判斷if v is not null,結果v為空時,觸發器執行到這裡就出錯。
於是我將變數改為整型,讓它返回記錄的count值,判斷是否大於0,ok,觸發器照我的想法跑了,嘿嘿。
原來出錯的觸發器:
create or replace trigger tig_bef_delete_sso_masters
before delete
on sso_masters_inf
for each row
declare
v sso_sp_list.master_sess_id%type
begin
update sso_masters_his set sso_masters_his.time_exit=sysdate where sso_masters_his.master_sess_id=:old.master_sess_id;
select master_sess_id into v from sso_sp_list where sso_sp_list.master_sess_id=:old.master_sess_id;
if v is not null then
delete from sso_sp_list where master_sess_id=:old.master_sess_id;
update sso_sp_list_his set time_sp_exit=sysdate where master_sess_id=:old.master_sess_id;
end if;
end tig_bef_delete_sso_masters;
修改後的觸發器
create or replace trigger tig_bef_delete_sso_masters
before delete
on sso_masters_inf
for each row
declare
vint;
begin
update sso_masters_his set sso_masters_his.time_exit=sysdate where sso_masters_his.master_sess_id=:old.master_sess_id;
select count(*) into v
from sso_sp_list where sso_sp_list.master_sess_id=:old.master_sess_id;
if v >0 then
delete from sso_sp_list where master_sess_id=:old.master_sess_id;
update sso_sp_list_his set time_sp_exit=sysdate where master_sess_id=:old.master_sess_id;
end if;
end tig_bef_delete_sso_masters;
Oracle中的觸發器
oracle 中的觸發器 在oracle 中,觸發器是一種特殊的子程式,它在插入 更新 刪除資料時自動執行。使用觸發器可以實現比較複雜的約束。pk fk uq ck df 都是單錶約束資料完整性。觸發器可以分為 insert 觸發器 update 觸發器 delete 觸發器。insert 觸發器在...
ORACLE觸發器 行級觸發器
行級觸發器 本章介紹行級觸發器機制。大部分例子以insert出發器給出,行級觸發器可從insert update delete語句觸發。1 介紹 觸發器是儲存在資料庫已編譯的儲存過程,使用的語言是pl sql,用編寫儲存過程一樣的方式編寫和編譯觸發器。下面在sql plus會話中建立和示例乙個簡單的...
Oracle觸發器介紹 行級觸發器
行級觸發器 本章介紹行級觸發器機制。大部分例子以insert出發器給出,行級觸發器可從insert update delete語句觸發。1 介紹 觸 髮器是儲存在資料庫已編譯的儲存過程,使用的語言是pl sql,用編寫儲存過程一樣的方式編寫和編譯觸發器。下面在sql plus會話中建立和示例一 個簡...