触发编译错误(插入)

时间:2012-03-29 05:47:04

标签: 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 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中执行。

2 个答案:

答案 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