триггер смены года оракула - PullRequest
0 голосов
/ 20 апреля 2011

У меня проблема, которую я не могу понять.Я создаю приложение в C ++ Builder 2009 и Oracle 11g.У меня есть некоторые расчетные данные, которые зависят от возраста пользователей.Что я хочу сделать, это пересчитывать эти данные каждый новый год.Я думал, что мог бы иметь триггер, чтобы сделать это, но я не знаю, какое событие я должен поймать, и я не нашел что-то в Интернете.

Моя таблица:

ATHLETE (name, ......, birthdate, Max_heart_frequency)

Max_heart_frequencyэто поле, которое зависит от возраста.Во вставке я рассчитываю возраст спортсмена, но как насчет следующего года?Может ли кто-нибудь помочь ????

Ответы [ 3 ]

2 голосов
/ 20 апреля 2011

Как рассчитывается max_heart_frequence?

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

CREATE VIEW v_athlete
AS 
select name, 
       case  
          -- younger than 20 years
          when (MONTHS_BETWEEN(sysdate, birthday) / 12) < 20 then 180

          -- younger than 40 years
          when (MONTHS_BETWEEN(sysdate, birthday) / 12) < 40 then 160

          -- younger than 60 years
          when (MONTHS_BETWEEN(sysdate, birthday) / 12) < 60 then 140

          -- everyone else
          else 120
       end as max_heart_frequency
from athlete

Тогда вам нужно только выбрать из вида, и он всегда будет точным.

0 голосов
/ 20 апреля 2011

Если Max_Heart_Frequency изменяется с течением времени, потому что пользователь стареет, почему вы храните его в таблице в первую очередь?Почему бы просто не вызвать функцию, которая вычисляет максимальную частоту сердечных сокращений во время выполнения, когда вам нужно это значение?Потенциально может иметь смысл иметь представление поверх таблицы Athlete, которое добавляет вычисляемый столбец Max_Heart_Frequency, чтобы скрыть от вызывающих абонентов, что это вычисляемый столбец.

0 голосов
/ 20 апреля 2011

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

Проверьте эту ссылку: http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/schedover.htm

У вас есть два варианта:

  1. Иметь хранимую процедуру, которая вычисляет и обновляет частоту Max_Heart_F для всех спортсменов каждый 01 января (используя годовое расписание процедуры)

  2. Иметь хранимую процедуру, которая выполняется ежедневно и рассчитывает и обновляет частоту Max_Heart_F для всех спортсменов каждый день (используя ежедневное расписание процедуры)

...