尝试创建触发器但出现错误 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 语句来获取值,但出现此错误。
你的问题不止一个:
- 声明部分(触发器中声明变量的部分)位于
for each row
部分之后
- 旧值和新值 "accessed" 如下:
:new.column_name
和 :old.column_name
- 插入触发器前的
:old
值始终为空,因为您插入的是新值,没有旧值,只有新值。
如果你想在某个值小于 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;
/
有关更多信息,请添加一些更详细的描述和一些示例数据,您可以在其中向我们展示您希望能够插入的数据类型以及原因以及您不想插入的数据类型以及原因。
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 语句来获取值,但出现此错误。
你的问题不止一个:
- 声明部分(触发器中声明变量的部分)位于
for each row
部分之后 - 旧值和新值 "accessed" 如下:
:new.column_name
和:old.column_name
- 插入触发器前的
:old
值始终为空,因为您插入的是新值,没有旧值,只有新值。 如果你想在某个值小于 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; /
有关更多信息,请添加一些更详细的描述和一些示例数据,您可以在其中向我们展示您希望能够插入的数据类型以及原因以及您不想插入的数据类型以及原因。