Trigger

sandysman
Дата: 02.12.2012 16:00:13
Не понимаю как правильно написать тригер. К примеру есть поле date типа дата. Хочу написать проверку на то, что если это поле пустое то поставить текущую дату.
Create trigger Proverka before Insert or update on Zakaz
declare
begin
if : old.Date=null then
: new.Date=current_date;
end Proverka;

примерно такой код, но тригер не работает, еще в тригере есть поле referencing в котором можно как я понял назначать old и new, но как правильно писать тригер с этим полем я так и не разобрался. Просвещенных просьба вразумить)
_Nikotin
Дата: 02.12.2012 16:38:34
 "= null" => "is null" 
Павел Воронцов
Дата: 02.12.2012 18:08:48
sandysman
Create trigger Proverka before Insert or update on Zakaz
for each row
begin
:new.Date=NVL(:new.Date,current_date);
end Proverka;
Bogdanov Andrey
Дата: 02.12.2012 18:20:30
sandysman,
:old - это значение, которое было до update
н иу про сравнение см null уже написали
softwarer
Дата: 02.12.2012 19:23:20
sandysman
Create trigger Proverka before Insert or update on Zakaz

Вы забыли важные слова for each row

sandysman
if : old.Date=null then
: new.Date=current_date;

:new.date := coalesce(:old.date, sysdate);

sandysman
примерно такой код, но тригер не работает,

Ну, в таком виде он даже не откомпилируется. Если исправить хотя бы основные ошибки (это построчность, присваивание, использование зарезервированного слова как имени поля) - то откомпилируется, но будет работать именно так, как Вы написали (то есть никак).
pit_alex
Дата: 03.12.2012 11:34:57
sandysman
Хочу написать проверку на то, что если это поле пустое то поставить текущую дату.


Может просто на поле поставит DEFAULT значение, и без всяких тригеров?
sandysman
Дата: 03.12.2012 12:21:47
Не ну это ясно и понятно, что проще, если б не препод то я в такой маразм и не впадал) а так, что придумал то и напишу. pit_alex,
sandysman
Дата: 03.12.2012 12:25:19
softwarer
sandysman
Create trigger Proverka before Insert or update on Zakaz

Вы забыли важные слова for each row

sandysman
if : old.Date=null then
: new.Date=current_date;

:new.date := coalesce(:old.date, sysdate);

sandysman
примерно такой код, но тригер не работает,

Ну, в таком виде он даже не откомпилируется. Если исправить хотя бы основные ошибки (это построчность, присваивание, использование зарезервированного слова как имени поля) - то откомпилируется, но будет работать именно так, как Вы написали (то есть никак).


А почему никак? так может не нужно проверку на old может написать все с new, ведь операции insert и update предпологают вставку новых значений.
Bogdanov Andrey
Дата: 03.12.2012 12:38:38
sandysman
так может не нужно проверку на old может написать все с new,
Что вам нужно, то и пишите. Если нужно проверять значения, которые после изменения появились, то проверяйте new, если те, которые были до, то проверяйте old.
sandysman
Дата: 03.12.2012 14:17:26
Сколько я пересмотрел примеров, но почему-то ни один мой тригер сделанный по этим примерам не работает. Может перед for each row нужно поставить referencing, а то у меня такое ощущение, что ни в old ни в new нет никаких переменных.

Данный тригер должен проверять старые значения в таблице с новыми, которые вставили и если код методичек совпал, то удалить данную строку, но конечно инчего из этого не работает, все делаю как показано в учебниках, примерах, такое ощущение, что они не oracle используют.

Create trigger ProverkaMetod After Insert or update on KontrMetod
For each row
begin
If : New.KodMetod=: old.KodMetod THEN
Delete kontrmetod Where kodmetod=: new.KodMetod;
end ProverkaMetod;

Переделанный код тринера, тоже ноль по работе, вроде задачи то стоят перед ними простые.
Create trigger Proverka before Insert or update on Zakaz
For each row
begin
If New.Datazakaz is NULL THEN
: new.datazakaz= current_date;
end Proverka;