Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > If-then-else в триггерах,


Автор: zhefran 10.3.2010, 11:34
Перевожу таблици с MySQL в Oracle. 
Столкнулся с проблемой. Исходная таблица
Код

create table p (
 id int,
 a varchar(10),
 d timestamp DEFAULT CURRENT_TIMESTAMP
                  ON UPDATE CURRENT_TIMESTAMP,
 constraint p_pk primary key (id)
);
 
В Oracle для ON UPDATE CURRENT_TIMESTAMP, нужно сделать триггер. Нашел такой код:
Код

create table p (id number, a varchar2(10), d date default sysdate, 
       constraint p_pk primary key (id));

insert into p(id,a) values (1,'test');

CREATE OR REPLACE TRIGGER p_d_trig
BEFORE UPDATE ON p
FOR EACH ROW
BEGIN
        select sysdate into :new.d from dual;
END p_d_trig;

update p set a='foo' where id=1;


Но при этом триггере я немогу делать update для даты, так как запишется текушая, а не изменямое значение.

Подскажите, пожалуйста, как мне изменить триггер, для реализации такой возможности.

Автор: ToshaCh 10.3.2010, 11:46
Код

if :new.d is nul then .....

Может так? Если в стейтменте не указана дата, то будет sysdate, если указана, то собственно её и берём.

Автор: zhefran 10.3.2010, 12:07
Спасибо за помощь!

Автор: DimW 10.3.2010, 13:40
Цитата(ToshaCh @  10.3.2010,  11:46 Найти цитируемый пост)
Может так?

может лучше по человечески smile :
Код

IF NOT UPDATING ('D') THEN :NEW.D = SYSDATE ...


Добавлено через 4 минуты и 59 секунд
Цитата(ToshaCh @  10.3.2010,  11:46 Найти цитируемый пост)
Если в стейтменте не указана дата, то будет sysdate, если указана, то собственно её и берём

к тому же дату и на null можно поменять - в DDL таблице она nullabel

Автор: Zloxa 10.3.2010, 14:00
Нихрена не понятно.
Тип http://msdn.microsoft.com/ru-ru/library/ms182776(SQL.90).aspx в M$ это вовсе не дата, а двоичные данные, которые характеризуют кагбе "версию" строки, и используется, обычно, для реализации стратегии оптимистического блокирования. Для тех же нужд, в оракле задуман псевдостолбец http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/pseudocolumns007.htm.

И вот в этом контексте конструкция "DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" применимая к этому столбцу выгдядит полной херней. Т.к. CURRENT_TIMESTAMP  возвращает дату, которая якобы должна запиаться в счетчик, который ведет сам M$ smile 

Автор: Fortop 10.3.2010, 14:09
Цитата(Zloxa @  10.3.2010,  13:00 Найти цитируемый пост)
Тип Timestamp в M$ 

Обращаю внимание
Цитата(zhefran @  10.3.2010,  10:34 Найти цитируемый пост)
MySQL


Автор: Zloxa 10.3.2010, 14:11
Цитата(Fortop @  10.3.2010,  14:09 Найти цитируемый пост)
MySQL

сорри.
Не правильно прочел.
Спасибо.

Автор: ToshaCh 10.3.2010, 14:13
Цитата(DimW @  10.3.2010,  13:40 Найти цитируемый пост)
может лучше по человечески

Да, так пожалуй лучше.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)