【问题标题】:Trigger to compare a count value from one table with a value from second table触发器将一个表中的计数值与第二个表中的值进行比较
【发布时间】:2020-01-09 12:28:52
【问题描述】:

我是 sql 的初学者,我正在尝试创建一个触发器,将两个不同表中的两个值与列 TrainingCde_ID 中的相同值进行比较

表 1 - 参与者

 Participant_ID | TrainingCde_ID 
 22             | SPOT2          
 23             | SPOT2     
 24             | SPOT2  
 11             | PRT1       

表 2 - 培训

 TrainingCde_ID | Capacity 
 SPOT2           | 2          
 TOP5            | 50         
 PRT1            | 20         

我想包含一个计数语句,它计算有多少参与者想要参加培训,然后比较该值是否大于第二个表中的容量值,会引发错误。

代码实际上应该告诉我,如果超过 2 名参与者想要参加培训,例如SPOT2,然后会有错误,告诉我,容量已满。

create or replace trigger trg_ucast
before insert or update 
on participants
for each row 
declare
    c_capacity training.capacity%type;
    Part_ID  integer;
begin

    select capacity into c_capacity
    from training
    where trainingCde_ID = :new.trainingCde_ID;

    select count (participant_ID) as PID into Part_ID
    from Participants ;

    if :new.Part_ID > :new.c_capacity then 
        raise_application_error(-20002, 'FULL CAPACITY!');
    end if;
end;
/

这是我创建的然后有这个错误>>

ERROR: pls-00049: bad bind variable 'new.Part_ID'
ERROR: pls-00049: bad bind variable 'new.c_capacity'

有人可以帮我解决这个错误吗?或者如果我的代码有错误?

【问题讨论】:

  • 我已经改进了你的代码格式:begin 应该与对应的declareend 对齐,if/end if 内的代码应该缩进等等。跨度>
  • 如果两个(或更多)人同时尝试注册怎么办?一个人的未提交活动对另一个人是不可见的。因此,如果他们只有另外一个注册的空间,那么双方都会认为有空间容纳他们,但是当双方都提交时,课程将被过度注册。

标签: oracle plsql count database-trigger multiple-tables


【解决方案1】:

这部分:

if :new.Part_ID > :new.c_capacity then 
    raise_application_error(-20002, 'FULL CAPACITY!');
end if;

不应使用:new,即应该是:

if Part_ID > c_capacity then 
    raise_application_error(-20002, 'FULL CAPACITY!');
end if;

但是您仍然会遇到问题,因为您的行级触发器是从它触发的表中选择的,这是有问题的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2013-05-24
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多