--觸發條件
delete from test_sj where id in (11); -- 一次刪除父的部分子時正常
delete from test_sj where id in (11,12); -- 一次刪除父的所有子時存在問題,問題在於:行級觸發器每次只能傳進一行記錄,判斷時總有一行處於「存在狀態」,可以用語句級觸發器試試,或者在應用程式裡寫個迴圈,為每層迴圈開啟乙個事務。
delete from test_sj where id in (21); -- 一次刪除父的唯一子時正常
--查詢
select * from test_sj;
--語句級觸發器
1.用包頭來定義資料結構
create or replace package pkg_test_sj_ids
astype p_ids is table of test_sj.id%type index by binary_integer;
v_ids p_ids;
v_pids p_ids;
v_numentries binary_integer := 0;
end pkg_test_sj_ids;
/show err;
2.行級觸發器
create or replace trigger tri_test_sj_ad_r
after delete on test_sj for each row
declare
begin
--[記錄資料]--
pkg_test_sj_ids.v_numentries := pkg_test_sj_ids.v_numentries + 1;
pkg_test_sj_ids.v_ids(pkg_test_sj_ids.v_numentries) := :old.id;
pkg_test_sj_ids.v_pids(pkg_test_sj_ids.v_numentries) := :old.p_id;
end tri_test_sj_ad_r;
/show err;
3.語句級觸發器
create or replace trigger tri_test_sj_ad_all
after delete on test_sj
declare
l_id test_sj.id%type;
l_pid test_sj.p_id%type;
l_cnt number;
begin
for v_loopindex in 1..pkg_test_sj_ids.v_numentries loop
--[獲取變數]--
l_id := pkg_test_sj_ids.v_ids(v_loopindex);
l_pid := pkg_test_sj_ids.v_pids(v_loopindex);
select count(id) into l_cnt from test_sj where p_id=l_id and id <> l_pid;
if l_cnt=0 then
update test_sj set remark='你沒有兒子了' where id=l_pid;
-- commit;
end if;
end loop;
pkg_test_sj_ids.v_numentries := 0;
end tri_test_sj_ad_all;
/show err;
--測試
delete from test_sj where id in (11,12); -- ok
delete from test_sj where id in (21); -- ok
Oracle 樹形自關聯表查詢SQL
平時會經常用到自關聯的樹形結構表來儲存樹形結構的資料,資料之間的層次聯絡代表著樹形結構中的父子關係,並通常用表中兩個列間的聯絡來描述,如下表中id 和 parent id,id為家族成員編號,parent id為父母編號,從而可以形成乙個樹形結構的家族關係。一 基本用法 基本語句 select fr...
自表關聯的模型寫法
在這裡以購物 商品分類為例 class goodscategory models.model 商品類別 category type 1,一級類目 2,二級類目 3,類目 name models.charfield default max length 30,verbose name 類別名 help...
自表關聯的模型寫法
在這裡以購物 商品分類為例 class goodscategory models.model 商品類別 category type 1,一級類目 2,二級類目 3,類目 name models.charfield default max length 30,verbose name 類別名 help...