Oracle数据库中触发器怎么完成业务逻辑?

已知两张表

--学生宿舍信息
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~