ошибка компиляции триггера (вставка) - PullRequest
0 голосов
/ 29 марта 2012

это мой код:

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

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 голосов
/ 29 марта 2012

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

having count(*) >0

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

0 голосов
/ 29 марта 2012

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

Вы писали:

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 вставленной строки превышает ее уровень переупорядочения, удалите его, а затем снова вставьте обратно.Это не имеет смысла и не может быть выполнено с помощью триггера FOR EACH ROW, поскольку вы получите ошибку «таблица мутируется».

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

...