追忆~似水年华 2020-06-01 11:42 采纳率: 0%
浏览 125
已采纳

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表中插入数据,否则无法插入数据

  • 写回答

1条回答 默认 最新

  • 知了学飞 2020-06-11 13:24
    关注

    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~

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题