gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:06:08 28 4
gpt4 key购买 nike

这是我的代码:

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 <15不要那样插入。

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触发器完成操作,因为您将收到“表正在变异”错误。
请说明您要达到的目标,然后我们可以帮助您确定是否可以实现。

关于triggers - 触发编译错误(插入),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9919725/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com