已知两张表
--学生宿舍信息
create table SDM(
--宿舍编号
dno char(4),
--学生姓名
sname varchar2(9),
primary key(dno,sname)
);
--物资发放明细
create table MDP(
--周
week char(2),
--宿舍编号
dno char(4),
--消毒液数量
dnum smallint default 0,
--口罩数量
rnum smallint default 0,
--领取人
sname varchar2(9) not null,
--领取时间
rdate date default sysdate,
primary key(week,dno),
foreign key (dno,sname) references SDM(dno,sname)
);
怎么用触发器实现:每个宿舍每周至多领取一瓶消毒液,每次可领取的口罩数量不超过本宿舍人数的2倍。
符合要求才能在MDP表中插入数据,否则无法插入数据
5年没有码字了,路过交个朋友。
--在表mdp上创建insert触发器
create or replace trigger check_data --创建触发器
before insert on mdp --表名
for each row
declare
l_counter number := 0;
begin
--要求1:每个宿舍每周至多领取1瓶消毒液
--1、x宿舍x周已经领过多少消毒液
select sum(dnum)
into l_counter
from MDP
where week = :new.week
and dno = :new.dno;
if l_counter+:new.dnum > 1 then
dbms_output.put_line(:new.week || '周已领用 ' || l_counter || '瓶消毒液。');
Raise_application_error(-20000, '用户定义异常。');
end if;
--要求2:每次可领取的口罩数量不超过本宿舍人数的2倍
--要素:宿舍总人数,新领用口罩数量
l_counter := 0;
select count(1) into l_counter from SDM where dno = :new.dno;
if :new.rnum > (l_counter * 2) then
dbms_output.put_line('宿舍号:' || :new.dno || '人数共' || l_counter ||
',此次领用' || :new.rnum || '个口罩,超量领用!');
Raise_application_error(-20000, '用户定义异常。');
end if;
end;
更多问题可以关注我,或加我QQ/VX:316187205
O(∩_∩)O~