triggers - 触发编译错误(插入)

这是我的代码:

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.如果使用了插入后触发器,这意味着所有这些都在正确插入后发生?如果我不想插入特定数据该怎么办?我的意思是,如果weight
2.如果我插入了多个数据该如何检索它们?是否为每个插入调用了触发器?(如果它是一个插入触发器)。

3.这给我一个编译错误,我只是找不到错误,即使使用光标也给我一个错误。
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 developer,很奇怪,我的许多触发器没有执行,但是它们在oracle 8i中执行。

最佳答案

我不知道您要做什么,但是您的语法是错误的(您从哪里获得的?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/

相关文章:

c++ - 使用Visual Studio Express和SDL2在Windows中破坏了SDL_

visual-studio-2010 - Visual Studio 2010 C++发行模式问题

android - 无法在 android opencv 2.3 中导入 ml.h

android - Debian Sid 上的 Android 内核总是出错

android - 在Eclipse上调试Android应用时出错

c++ - 如何在 Windows XP 上正确安装 ffmpeg?

ios - ZXing Xcode 4.2 iOS编译错误

javascript - 编译CoffeeScript

compiler-errors - 使用ROSE编译器框架的g++编译器错误

ios - 由于未捕获的异常 'NSInvalidArgumentException' 错误而终止应