追忆~似水年华 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 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵