我遇到了一个我无法弄清楚的问题。我在c ++ builder 2009和oracle 11g中构建应用程序。我有一些依赖于用户年龄的计算数据。我想做的是每年都重新计算这些数据。我以为我可以触发这样做,但我不知道应该抓到哪个事件,而且我没有在互联网上找到什么。
我的表是:
ATHLETE (name, ......, birthdate, Max_heart_frequency)
Max_heart_frequency是取决于年龄的字段。插入时我计算了运动员的年龄,但是明年呢?????? 谁能帮忙????
答案 0 :(得分: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
然后您只需要从视图中进行选择,它始终是准确的。
答案 1 :(得分:0)
您可以使用oracle调度程序以特定的时间间隔运行程序(可以是分钟小时,每天,每年等等。任何时间跨度)。
检查此链接:http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/schedover.htm
您有两种选择:
有一个存储过程,每1月1日(使用程序的年度安排)计算和更新所有运动员的Max_Heart_Frequency
拥有一个每天运行的存储过程,每天计算并更新所有运动员的Max_Heart_Frequency(使用每日程序安排)
答案 2 :(得分:0)
如果Max_Heart_Frequency
因用户年龄的增长而发生变化,为什么首先要将其存储在表格中?为什么不在需要时调用运行时计算最大心率的函数?潜在地,在Athlete
表的顶部添加计算Max_Heart_Frequency
列以隐藏调用者这是一个计算列可能是有意义的。