2012-03-29 2 views
0

это мой код:ошибка запуска компиляции (вставка)

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.if после запуска вставки используется это означает, что все это происходит после того, как вставить прямо, что если я хочу не вставлять конкретные данные, что я делаю? Я имею в виду, например, если вес < 15 не помещайте это.

2.if Я вставил несколько данных, как их получить? Запускается ли триггер для каждой вставки? (Если это триггер вставки).

3.this дает мне ошибку компиляции, я просто не могу найти ошибку, даже используя курсор, дает мне ошибку.

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; 

Btw Я использую SQL Developer, weidly многие из моего триггера не выполняется, но они выполняются в Oracle 8i.

+2

Oracle триггеры должны быть записаны в PL/SQL, в котором нет команд «set» и «go», которые вы пытаетесь использовать. –

ответ

0

Я не могу понять, что вы пытаетесь сделать, но ваш синтаксис - все неправильно (откуда вы его взяли? SQL Server?). См. documentation для правильного синтаксиса.

Вы писали:

set sqty=(select stockqty from inserted); 

Я подозреваю, что вы хотите сделать это:

sqty := :new.stockqty; 

Ditto следующих 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, поскольку вы получите ошибку «table is mutating».

Пожалуйста, объясните, что вы пытаетесь достичь, и тогда мы сможем помочь выяснить, может ли оно быть достигнуто.

0

Ответы:
1. Вы можете использовать для этого Check Constraint
2. Я не понимаю, что вы имеете в виду:
, если вы хотите найти дублированные записи, то вы можете сгруппировать по всем полям и использовать

having count(*) >0 

но зачем использовать спусковой крючок?
или, может быть, вы имеете в виду, что хотите значения в триггере? если это так, используйте :new and :old

Смежные вопросы