Форум: "Базы";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
ВнизНикто не подскажет, в чем здесь логическая ошибка? Найти похожие ветки
← →
}|{yk © (2004-02-19 16:57) [0]Триггер записывает не необходимое значение, а затирает текущее
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/ Но вместо этого он затирает значение в этом поле. В чем глюк?
← →
Guest (2004-02-19 17:01) [1]Попробовать удалить "old as old"?
← →
Reindeer Moss Eater © (2004-02-19 17:18) [2]Подсказка
declare
i integer;
n integer;
r number;
begin
i:=1;
n:=null;
r := i - n;
if r is null then
dbms_output.put_line("null");
else
dbms_output.put_line(to_char(r));
end if;
end;
← →
}|{yk © (2004-02-19 17:30) [3]Да нет
Если в триггер добавить
select a.summa_free into summ from app_plateg a where a.plat_id=:new.plat_id;
то summ будет имет пустое значение
да и какой смысл проверять - app_plateg и app_bank имеют связь 1-m
так что summ_free обязательно будет иметь значение, как и :new.summa
← →
}|{yk © (2004-02-19 17:32) [4]Если бы select a.summa_free into summ from app_plateg a where a.plat_id=:new.plat_id;
не давало результатов, я бы получил ошибку no_data_found ее нет, но и результата тоже
← →
Guest (2004-02-19 17:35) [5][4] }|{yk © (19.02.04 17:32)
Перевожу намек RME. Из двух операндов хотя бы один почему-то NULL.
← →
Reindeer Moss Eater © (2004-02-19 17:37) [6]Ты что, так и не понял, что тебе намекали на то, что -:new.summa is null?
<Что_то> минус NULL равняется NULL
Если апдейт твоего триггера выполняется так как ты говоришь (затирается одна запись в другой таблице) то WHERE сработало.
Но раз в итоге поле затерлось, значит один из операндов в выражении app_plateg.summa_free-:new.summa имеет значение NULL.
Ну или оба имеют это значение.
Протрассировать трудно что ли?
← →
}|{yk © (2004-02-19 17:40) [7]я это знаю. Но с какой радости? :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
← →
}|{yk © (2004-02-19 17:42) [8]>>Протрассировать трудно что ли?
А чем можно триггер протрассировать?
← →
Guest (2004-02-19 17:45) [9]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:45) [10]Если сделать так
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
Но как это может быть?
← →
}|{yk © (2004-02-19 17:47) [11]a.summa_free IS NOT NULL!
← →
Reindeer Moss Eater © (2004-02-19 17:49) [12]a.summa_free IS NOT NULL!
Да наздоровье.
Ты что, так и не понял, что тебе намекали на то, что -:new.summa is null?
← →
Reindeer Moss Eater © (2004-02-19 17:51) [13]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) [14]}|{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;
← →
}|{yk © (2004-02-19 17:52) [15]как она м.б. 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
← →
Guest (2004-02-19 17:52) [16][12] Reindeer Moss Eater © (19.02.04 17:49)
Судя по в поле заносится -:new.summa NULL у него именно summa_free из таблицы
← →
Guest (2004-02-19 17:55) [17][15] }|{yk © (19.02.04 17:52)
Вы после затирания информации в таблице от неправильного срабатывания триггера данные восстанавливаете перед новым запуском?
Держу пари, что нет :)
← →
}|{yk © (2004-02-19 17:57) [18]Мдя...
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, хотя он точно не пустой. Не ясно...
← →
}|{yk © (2004-02-19 17:59) [19]С тебя пиво!
Конечно восстанавливаю
← →
Guest (2004-02-19 18:01) [20]>Во время выполнения триггера app_plateg.summa_free - null, хотя он точно не пустой
Как проверял?
select summa_free from ... что возвращает?
select count(*) into ... from .. where summa_free IS NULL что возвращает?
ЗЫ. О пиве потом поговорим :)
← →
}|{yk © (2004-02-19 18:03) [21]Сорри
В базе был еще один триггер (базу делал не я), который хотя и было написано что делает обновление, на деле стоял на вставку. Потому и затиралось
Вот его код
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;
← →
Val © (2004-02-19 18:04) [22]где было написано?
← →
Guest (2004-02-19 18:05) [23][21] }|{yk © (19.02.04 18:03)
Так как насчет пива за наши с RME мучения? :))))
← →
}|{yk © (2004-02-19 18:07) [24]В описании базы (документик такой у нас программеры баз пишут а потом передают их программерам GUI)
← →
Val © (2004-02-19 18:09) [25]мда.ясно.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.031 c