Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: CL | DM;

Вниз

Никто не подскажет, в чем здесь логическая ошибка?   Найти похожие ветки 

 
}|{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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.023 c
1-1078474704
Ш-К
2004-03-05 11:18
2004.03.28
Как передать в параметре имя класса?


1-1078484177
PiratA
2004-03-05 13:56
2004.03.28
Динамическое создание компонент...


14-1078405998
Multy
2004-03-04 16:13
2004.03.28
Нашёл тут класный анекдот


3-1077718586
TransparentGhost
2004-02-25 17:16
2004.03.28
Or в Locate


1-1078900964
Лысый
2004-03-10 09:42
2004.03.28
Округление