尝试创建触发器但出现错误 PLS-00103

Trying to create a trigger but get error PLS-00103

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;

给出这个神秘错误

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,则不应插入正在插入合同的记录。因此我需要检查插入的每条记录的合同计数值。我使用 select 语句来获取值,但出现此错误。

你的问题不止一个:

  1. 声明部分(触发器中声明变量的部分)位于 for each row 部分之后
  2. 旧值和新值 "accessed" 如下::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;
    /
    

Here is a small demo

有关更多信息,请添加一些更详细的描述和一些示例数据,您可以在其中向我们展示您希望能够插入的数据类型以及原因以及您不想插入的数据类型以及原因。