这是我的代码:
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;
create or replace trigger t1
after insert on stock for each row
declare
cursor cl is select isbn,stockqty,reorderlevel,reorderquantity from stock where isbn>0;
begin
for c2 in c1 loop
if c2.stockqty>c2.reorderlevel then
delete from stock where isbn=c2.isbn;
insert into stock values(c2.isbn,c2.reorderquantity,c2.reorderlevel,c2.reorderquantity);
end if;
end loop;
end;
最佳答案
我不知道您要做什么,但是您的语法是错误的(您从哪里获得的?SQL Server?)。有关正确的语法,请参见documentation。
你写了:
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;
这似乎意味着,如果插入的行的库存量超过其重新订购水平,则将其删除,然后再次将其重新插入。这没有任何意义,并且无法使用FOR EACH ROW触发器完成操作,因为您将收到“表正在变异”错误。https://stackoverflow.com/questions/9919725/