Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
7-1072683238
Babay
2003-12-29 10:33
2004.03.28
Региональные настройки


14-1077894056
syte_ser78
2004-02-27 18:00
2004.03.28
C выходными и концом зимы


7-1073569477
Яша
2004-01-08 16:44
2004.03.28
чтение файла по секторам


1-1078405248
Silver_
2004-03-04 16:00
2004.03.28
В OnCreate Формы требуется Application.Terminate но...


6-1074061607
Клювокрылый
2004-01-14 09:26
2004.03.28
php сервер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский