![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Никто не подскажет, в чем здесь логическая ошибка? [D6]
}|{yk © (2004-02-19 16:57:00)Триггер записывает не необходимое значение, а затирает текущее
CREATE OR REPLACE TRIGGER APP_BANK_A_INSERT
BEFORE
INSERT
ON APP_BANK
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
declare
begin
update app_plateg set app_plateg.summa_free=app_plateg.summa_free-:new.summa where app_plateg.plat_id=:new.plat_id;
end;
/
Он должен при добавлении записи в таблицу app_bank уменьшать на соответствующее значение поле summ_free в таблице app_plateg/ Но вместо этого он затирает значение в этом поле. В чем глюк?
Val (2004-02-19 18:09:00) [1]мда.ясно.
}|{yk (2004-02-19 18:07:00) [2]В описании базы (документик такой у нас программеры баз пишут а потом передают их программерам GUI)
Guest (2004-02-19 18:05:00) [3][21] }|{yk © (19.02.04 18:03)
Так как насчет пива за наши с RME мучения? :))))
Val (2004-02-19 18:04:00) [4]где было написано?
}|{yk (2004-02-19 18:03:00) [5]Сорри
В базе был еще один триггер (базу делал не я), который хотя и было написано что делает обновление, на деле стоял на вставку. Потому и затиралось
Вот его код
declare
summ number;
summ_plateg number;
begin
select a.summa_free into summ_plateg from app_plateg a where a.plat_id=:new.plat_id;
summ:=summ_plateg-:old.summa+:new.summa;
update app_plateg set app_plateg.summa_free=summ where app_plateg.plat_id=:new.plat_id;
end;
Guest (2004-02-19 18:01:00) [6]>Во время выполнения триггера app_plateg.summa_free - null, хотя он точно не пустой
Как проверял?
select summa_free from ... что возвращает?
select count(*) into ... from .. where summa_free IS NULL что возвращает?
ЗЫ. О пиве потом поговорим :)
}|{yk (2004-02-19 17:59:00) [7]С тебя пиво!
Конечно восстанавливаю
}|{yk (2004-02-19 17:57:00) [8]Мдя...
declare
begin
update app_plateg set app_plateg.summa_free=:new.summa where app_plateg.plat_id=:new.plat_id;
end;
Во время выполнения триггера app_plateg.summa_free - null, хотя он точно не пустой. Не ясно...
Guest (2004-02-19 17:55:00) [9][15] }|{yk © (19.02.04 17:52)
Вы после затирания информации в таблице от неправильного срабатывания триггера данные восстанавливаете перед новым запуском?
Держу пари, что нет :)
Guest (2004-02-19 17:52:00) [10][12] Reindeer Moss Eater © (19.02.04 17:49)
Судя по в поле заносится -:new.summaNULL у него именно summa_free из таблицы
}|{yk (2004-02-19 17:52:00) [11]как она м.б. null если написав
declare
begin
update app_plateg set app_plateg.summa_free=:new.summa where app_plateg.plat_id=:new.plat_id;
end;
я получаю в app_plateg.summa_free :new.summa
Reindeer Moss Eater (2004-02-19 17:51:00) [12]CREATE OR REPLACE TRIGGER APP_BANK_A_INSERT
BEFORE
INSERT
ON APP_BANK
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
declare
begin
if :new.summa is NULL then RAISE;
end if;
update app_plateg set app_plateg.summa_free=app_plateg.summa_free-:new.summa where app_plateg.plat_id=:new.plat_id;
end;
/
Val (2004-02-19 17:51:00) [13]}|{yk © (19.02.04 17:45) [10]
2 проверки покажут who is who:
1:
declare
begin
update app_plateg set app_plateg.summa_free=app_plateg.summa_free where app_plateg.plat_id=:new.plat_id;
end;
2:
declare
begin
update app_plateg set app_plateg.summa_free=:new.summa where app_plateg.plat_id=:new.plat_id;
end;
Reindeer Moss Eater (2004-02-19 17:49:00) [14]a.summa_free IS NOT NULL!
Да наздоровье.
Ты что, так и не понял, что тебе намекали на то, что - :new.summa is null?
}|{yk (2004-02-19 17:47:00) [15]a.summa_free IS NOT NULL!
}|{yk (2004-02-19 17:45:00) [16]Если сделать так
declare
summ number;
begin
select count(a.summa_free) into summ from app_plateg a where a.plat_id=:new.plat_id;
summ:=summ-:new.summa;
update app_plateg set app_plateg.summa_free=summ where app_plateg.plat_id=:new.plat_id;
end;
в поле заносится -:new.summa. count(a.summa_free) = 0
Но как это может быть?
Guest (2004-02-19 17:45:00) [17]select count(a.summa_free) into summ from app_plateg a where a.plat_id=:new.plat_id;
выдает 0
потому что a.summa_free IS NULL.
count(*) <> count(column)
}|{yk (2004-02-19 17:42:00) [18]>>Протрассировать трудно что ли?
А чем можно триггер протрассировать?
}|{yk (2004-02-19 17:40:00) [19]я это знаю. Но с какой радости? :new.summa не null, потому что
update app_plateg set app_plateg.summa_free=:new.summa where app_plateg.plat_id=:new.plat_id;
запишет в платежи новую сумму. app_plateg.summa_free не может быть null, однако
select count(a.summa_free) into summ from app_plateg a where a.plat_id=:new.plat_id;
выдает 0
Reindeer Moss Eater (2004-02-19 17:37:00) [20]Ты что, так и не понял, что тебе намекали на то, что -:new.summa is null?
<Что_то> минус NULL равняется NULL
Если апдейт твоего триггера выполняется так как ты говоришь (затирается одна запись в другой таблице) то WHERE сработало.
Но раз в итоге поле затерлось, значит один из операндов в выражении app_plateg.summa_free-:new.summa имеет значение NULL.
Ну или оба имеют это значение.
Протрассировать трудно что ли?