триггер изменения года oracle

#oracle11g #c builder

#oracle11g #c builder

Вопрос:

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

Моя таблица :

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

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

Ответ №1:

Как вычисляется 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
  

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

Комментарии:

1. Это не такая простая формула, она не будет работать должным образом, как эта, но спасибо!

2. Если формула не так проста, поместите ее в сохраненную функцию и вызовите эту функцию из представления

Ответ №2:

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

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

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

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

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

Комментарии:

1. Я думаю, что это решение, которое я искал. Я проверю это … спасибо за помощь!

Ответ №3:

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

Комментарии:

1. Это вариант. Спасибо за ваш ответ.