Попытка создать триггер, но получить ошибку PLS-00103 - PullRequest
1 голос
/ 15 марта 2020
create or replace trigger newcontract
before insert on contract
declare numcon int;
for each row
begin
    select contractcount 
    into numcon from task
    where task.taskid = old.taskid;
    if numcon < 3 then
        insert into contract values(taskid, workerid, payment);
    else
        dbms_output.put_line('task is full');
    end if;
end;

Дает этот крипт c ошибка

Error(1,5): PLS-00103: Encountered the symbol "FOR" when expecting one of the following:     begin function pragma procedure subtype type <an identifier>    <a double-quoted delimited-identifier> current cursor delete    exists prior 

Запись, вставляемая в контракт, не должна вставляться, если количество контрактов для этой задачи равно 2. Поэтому мне нужно проверить значение счет контракта для каждой вставляемой записи. Я использую оператор выбора, чтобы получить значение, но я получаю эту ошибку.

1 Ответ

2 голосов
/ 15 марта 2020

У вас есть более одной проблемы:

  1. раздел объявления (часть триггера, где вы объявляете переменные) идет после for each row части
  2. СТАРЫЙ и НОВЫЙ Доступ к значениям осуществляется следующим образом: :new.column_name и :old.column_name
  3. Значение :old перед триггером вставки всегда равно нулю, поскольку вы вставляете новое значение, старого значения нет, только новое значение .
  4. Если вы хотите запретить вставку, если какое-то значение меньше 3, вы можете сделать это следующим образом:

    create or replace trigger newcontract
    before insert on contract 
    for each row
    
    declare 
    
    numcon int;
    
    begin
    
        select contractcount 
        into numcon 
        from task
        where task.taskid = :new.taskid;
    
        if numcon < 3 then
            raise_application_error(-20000, 'Task is full');
        end if;
    
    end;
    /
    

Здесь это небольшая демонстрация

Для получения дополнительной информации, пожалуйста, добавьте более подробное описание и некоторые примеры данных, где вы покажете нам, какие данные вы хотите иметь возможность вставлять, почему и какие данные вы не хотите вставлять и почему.

...