这是我的代码:
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.如果使用插入后触发器,它意味着所有这一切都在插入后发生?如果我不想插入特定数据该怎么办?我的意思是如果重量< 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中执行。
答案 0 :(得分:0)
我无法弄清楚你要做什么,但你的语法都错了(你从哪里得到它?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;
这似乎意味着如果插入的行的stockqty超过其reorderlevel,则删除它然后再将其重新插入。这没有任何意义,并且无法使用FOR EACH ROW触发器完成,因为您将获得“表正在变异”错误。
请解释您想要达到的目标,然后我们可以帮助您了解是否可以实现。
答案 1 :(得分:0)
回答:
你可以用Check Constraint作为那个
我不明白你的意思:
如果要查找重复记录,则可以按所有字段分组并使用
having count(*) >0
但为什么要使用触发器?
或者你的意思是你想要触发器中的值?如果是这样,请使用
:new and :old