Триггер для сравнения значения счетчика из одной таблицы со значением из второй таблицы - PullRequest
0 голосов
/ 09 января 2020

Я новичок в 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         

Я хотел включить инструкцию подсчета, которая подсчитывает, сколько участников хочет посетить тренинг, а затем сравнивает, если значение больше значения Capacity во второй таблице, возникнет ошибка .

Код должен практически сказать мне, что если более 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'

Может кто-нибудь помочь мне с ошибкой? Или, если в моем коде есть ошибка?

1 Ответ

1 голос
/ 09 января 2020

Эта часть:

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;

Однако у вас все еще будет проблема, потому что ваш триггер уровня строки выбирает из таблица, на которой он запускается, что проблематично c.

...