【发布时间】: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应该与对应的declare和end对齐,if/end if内的代码应该缩进等等。跨度> -
如果两个(或更多)人同时尝试注册怎么办?一个人的未提交活动对另一个人是不可见的。因此,如果他们只有另外一个注册的空间,那么双方都会认为有空间容纳他们,但是当双方都提交时,课程将被过度注册。
标签: oracle plsql count database-trigger multiple-tables