2011-04-20 27 views
0

我对一个我无法解决的问题感兴趣。我在C++ builder 2009和oracle 11g中构建应用程序。我有一些计算的数据取决于用户的年龄。我想要做的是每过一年重新计算这些数据。我想我可以有一个触发器来做到这一点,但我不知道我应该捕捉哪个事件,而且我没有在互联网上找到任何东西。oracle年度更改触发器

我的表是:

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

Max_heart_frequency是取决于年龄的领域。在插入我计算运动员的年龄,但明年呢? 任何人都可以帮忙吗?

回答

0

您可以使用oracle调度程序以特定的时间间隔(可以是分钟小时,每日,每年等任何时间跨度)运行过程。

入住此临客:http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/schedover.htm

你有两个选择:

  1. 有计算并更新每隔01st一月所有的运动员的Max_Heart_Frequency(使用过程中每年安排一个存储过程)

  2. 有一个每天运行的存储过程,每天计算并更新所有运动员的Max_Heart_Frequency(使用过程的每日调度)

+0

我认为这是我一直在寻找的解决方案。我会检查出来......感谢您的帮助! – 2011-04-22 07:08:23

2

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

这不是那么简单的公式,它没有像这样正常工作,但谢谢! – 2011-04-22 07:09:09

+0

如果公式不那么简单,则将其放入存储函数中,并从视图中调用该函数 – 2011-04-22 07:13:54

0

如果Max_Heart_Frequency随着时间的推移而变化,因为用户年龄越来越大,为什么你首先将它存储在表中呢?为什么不直接调用计算运行时最大心率的函数呢?潜在地,在Athlete表上添加计算的Max_Heart_Frequency列以隐藏来自调用者的这个计算列是有意义的。

+0

这是一个选项。感谢您的回复。 – 2011-04-22 07:06:18