Создать триггер в оракуле sql - PullRequest
0 голосов
/ 26 декабря 2018

Я создал триггер в SQL, но получил ошибку и не знаю, в чем заключается ошибка в моем коде.Я пытался найти свое решение по другим вопросам, но не нашел ответа по моей проблеме

Мне нужен триггер, который изменяет значение моей переменной таблиц, например: у меня есть значение (200 кг) впеременная с именем used_weight, и когда я вставляю, обновляю или удаляю эту переменную, значение должно быть таким же, как в моем коде.

И ошибка компиляции ниже

Предупреждение: триггер созданс ошибками компиляции

Когда я обновляю свою переменную, я получаю ошибку

ОШИБКА в строке 1:
ORA-04098: триггер 'ALI.LEFT_BALANCE' равеннедопустимая и неудачная повторная проверка

Это мой код:

create or replace trigger left_balance
before delete or insert or update on reels_table
for each row
declare
begin
    user_weight:=:new.used_weight+:old.used_weight;
    left_weight:=weight-used_weight;
end;
/

, и я объявил переменные, но ошибка остается той же

create or replace trigger left_balance
before delete or insert or update on reels_table
for each row
declare
x number=:new.user_weight;
xx number=:old.user_weight;

begin
user_weight:=x+xx;
left_weight:=weight-user_weight;
end;
/

1 Ответ

0 голосов
/ 26 декабря 2018

ниже приведен простой пример, но сначала позвольте мне объяснить несколько вещей:

в коде plsql, когда вы хотите использовать переменные, вы должны объявить их (как объяснил бит @sticky).

пример:

 declare var1 varchar2(10); 
 var1 varchar2(10);

Вы используете триггер в таблице reels_table1, это приведет к мутации ошибки, однако, поскольку вы использовали before, вы не столкнулись с ошибкой.

как @Daniel E указывает, что у вставки не будет старого значения.

Обратите внимание, что в приведенном ниже примере я создал тестовую таблицу и добавил в обновление условие, может быть, вы его забудете.

drop table reels_table1
/
create table reels_table1 (id number(4), user_weight number(4), left_weight number(4),weight number(4) )
/
create or replace trigger left_balance
before delete or insert or update on reels_table1
for each row
declare

x number(2)  := :new.user_weight;
xx number (2) := :old.user_weight;
begin

update reels_table1 set 
user_weight =x+xx where id =1;

update reels_table1 set left_weight = weight - user_weight where id=1;

end;
/
...