亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

oracle自關(guān)聯(lián)表的子刪父變功能實現(xiàn)

系統(tǒng) 1805 0

--需求
? 一張自關(guān)聯(lián)的父子表,實現(xiàn)刪除子記錄時判斷父記錄下是否還有子記錄,如果沒有子記錄,則更新父記錄。
--建表
create table test_sj (id number(8) not null,p_id number(8),remark varchar2(200));
alter table test_sj add constraint PK_test_sj primary key (id);
alter table test_sj add constraint FK_test_sj foreign key (p_id) references test_sj (id);
--插數(shù)據(jù)
truncate table test_sj;
insert into test_sj values (0,null,'0');
insert into test_sj values (1,0,'0');
insert into test_sj values (2,0,'0');
insert into test_sj values (11,1,'1');
insert into test_sj values (12,1,'1');
insert into test_sj values (21,2,'2');
commit;
--觸發(fā)器
create or replace trigger tri_test_sj_ad after delete on test_sj for each row
declare
? -- 定義變量
pragma autonomous_transaction;
l_cnt number;
begin
??? select count(id) into l_cnt from test_sj where p_id=:old.p_id and id <> :old.id;
??? if l_cnt=0 then
????? update test_sj set remark='你沒有兒子了' where id=:old.p_id;
????? commit;
??? end if;
??? raise_application_error(-20001,'你來了嗎?'||l_cnt);
end tri_test_sj_ad;
/
show err;
alter trigger tri_test_sj_ad disable;

create or replace trigger tri_test_sj_bd before delete on test_sj for each row
declare
? -- 定義變量
pragma autonomous_transaction;??????? --設(shè)為自治事務(wù),從而避免ORA-14552(無法在一個查詢或DML中執(zhí)行DDL、COMMIT、ROLLBACK)、ORA-14551(無法在一個查詢中執(zhí)行DML操作)等錯誤
l_cnt number;
begin
??? select count(id) into l_cnt from test_sj where p_id=:old.p_id and id <> :old.id;
??? if l_cnt=0 then
????? update test_sj set remark='你沒有兒子了' where id=:old.p_id;
????? commit;
??? end if;
--??? raise_application_error(-20001,'你來了嗎?'||l_cnt);
end tri_test_sj_bd;
/
show err;
alter trigger tri_test_sj_bd disable;

--觸發(fā)條件
delete from test_sj where id in (11);???? -- 一次刪除父的部分子時正常
delete from test_sj where id in (11,12);? -- 一次刪除父的所有子時存在問題,問題在于:行級觸發(fā)器每次只能傳進(jìn)一行記錄,判斷時總有一行處于“存在狀態(tài)”,可以用語句級觸發(fā)器試試,或者在應(yīng)用程序里寫個循環(huán),為每層循環(huán)開啟一個事務(wù)。
delete from test_sj where id in (21);???? -- 一次刪除父的唯一子時正常
--查詢
select * from test_sj;

--語句級觸發(fā)器
1.用包頭來定義數(shù)據(jù)結(jié)構(gòu)
CREATE OR REPLACE Package Pkg_test_sj_ids
As
?type 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.行級觸發(fā)器
Create Or Replace Trigger Tri_test_sj_ad_r
?After Delete On test_sj for each row
Declare
Begin
?--[記錄數(shù)據(jù)]--
? 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.語句級觸發(fā)器
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自關(guān)聯(lián)表的子刪父變功能實現(xiàn)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久频这里精品99香蕉久网址 | 久久五月天婷婷 | 四虎影视最新网站在线播放 | 91视频福利 | 伦理片一区 | 亚洲欧美日韩中文在线 | 欧美日韩国产中文字幕 | 久久国产精品亚洲va麻豆 | 日韩 欧美 自拍 在线 视频 | 91视频爱爱 | 欧洲成人在线观看 | 天天干天天插天天操 | 全部精品孕妇色视频在线 | 色人久久| 91香蕉网站 | 国产精品主播在线 | 精品一区二区三区 不卡高清 | 麻豆久久精品 | 日本三级做a全过程在线观看 | 免费在线观看毛片 | 奇米影视盒7777 | 国产精品成人扳一级aa毛片 | 四虎一区| 99精品国产第一福利网站 | 久久免费看 | 亚洲精品乱码久久久久久蜜桃欧美 | 久久青青草原精品影院 | 欧美国产精品亚洲精品第一区 | 91视频地址 | 国产高清不卡一区二区 | 成人欧美一区二区三区在线 | 性短视频在线观看免费不卡流畅 | 国产美女mm131爽爽爽免费 | 亚洲另类第一页 | 手机看片日韩高清国产欧美 | 日本一区二区在线视频 | 日日摸日日碰夜夜爽久久 | 狠狠躁日日躁人人爽 | 欧美激情高清免费不卡 | 四虎永久精品免费网址大全 | 欧美一级毛片在线播放 |