追忆~似水年华 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 用sql语句完成下列问题
  • ¥50 yalmip+Gurobi 求解线性规划
  • ¥15 微信开发者工具/云函数/数据库
  • ¥15 如何导出数据库中的表格
  • ¥15 Torch not compiled with CUDA enabled
  • ¥15 三种节点编号优化算法比较
  • ¥15 比特币ord程序wallet_constructor.rs文件支持一次性铸造1000个代币,并将它们分配到40个UTXO上(每个UTXO上分配25个代币),并设置找零地址
  • ¥115 用Java解决探地雷达dzt文件的解析过程
  • ¥20 有关神经网络这道(b)determine the parameters of neural network
  • ¥25 annaconda jvpyter