Triggers 触发器编译错误(插入)

Triggers 触发器编译错误(插入),triggers,insert,compiler-errors,oracle11g,Triggers,Insert,Compiler Errors,Oracle11g,这是我的代码: create or replace trigger th after insert on stock for each row declare sqty number; rl number; isb number; rq number; begin set sqty=(select stockqty from inserted); set rl=(select reorderlevel from inserted); set

这是我的代码:

create or replace trigger th
after insert on stock
for each row
declare
    sqty number;
    rl number;
    isb number;
    rq number;
begin
    set sqty=(select stockqty from inserted);
    set rl=(select reorderlevel from inserted);
    set isb=(select isbn from inserted);
    set rq=(select reorderquantity from inserted);
go
if sqty> rl then
    delete from stock where isb=isbn;
    insert into stock values(isb,sqty,rl,rq);
end if;
end;
问题:


1.如果使用插入后触发器,则意味着所有这些都是在插入后发生的,对吗?如果我不想插入特定数据,该怎么办?我的意思是,如果权重我无法理解您试图执行的操作,但您的语法都错了(您从哪里获得的?SQL Server?)。有关正确的语法,请参阅

你写道:

set sqty=(select stockqty from inserted);
我怀疑你想这样做:

sqty := :new.stockqty;
接下来的3行也是如此

那么你有:

go
if sqty> rl then
    delete from stock where isb=isbn;
    insert into stock values(isb,sqty,rl,rq);
end if;
这是胡说八道。把它拿走

那么你有:

go
if sqty> rl then
    delete from stock where isb=isbn;
    insert into stock values(isb,sqty,rl,rq);
end if;
这似乎意味着,如果插入行的stockqty超过其reordlevel,则将其删除,然后将其重新插入。这毫无意义,并且不能使用FOR-EACH行触发器来完成,因为您将得到“table is mutating”错误

请解释您试图实现的目标,然后我们可以帮助您看看是否能够实现。

答案:
1.您可以使用一个 2.我不明白你的意思:
如果要查找重复记录,则可以按所有字段分组并使用

having count(*) >0
但是为什么要使用触发器呢?
或者你的意思是你想要触发器中的值?如果是,请使用

Oracle触发器必须用PL/SQL编写,而PL/SQL没有您试图使用的“set”和“go”命令。