可能重复:
Trigger based on sysdate
1.我有一张表,每天必须在12:00(24小时格式)执行更新操作。
我该如何做到这一点?
表架构:
CREATE TABLE CHARGES
(
total NUMBER(30),
admitdate TIMESTAMP(6),
dischargedate TIMESTAMP(30)
)
更新算法:
if
{
dischargedate="null"
then total=admitdate-sysdate=difference in days * Total
Do this every day at 12:00(24 Hr. Format)
}
else
{
do nothing.
}
答案 0 :(得分:1)
每24小时运行一次作业的标准是使用系统包DBMS_SCHEDULER
以此间隔运行作业。
例如:
BEGIN
DBMS_SCHEDULER.create_job (
job_name => 'update_charges',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN my_procedure; END;',
start_date => TRUNC(SYSDATE) + 0.5,
repeat_interval => 'freq=daily;',
end_date => NULL,
enabled => TRUE,
comments => 'Update the discharged date in charges.');
END;
/
然后创建一个要运行的过程:
create or replace PROCEDURE my_procedure is
begin
update charges
set total = admitdate - sysdate
where dischargedate is null;
end;
/
这会将列总数更新为admitdate
和SYSDATE之间的天数。
然而,我怀疑是否需要这样做。这听起来非常像古老的“我应该存储年龄”的问题。 I believe the answer is no.在某些方面你绝对是错的,并且有许多可能导致作业手动错误运行。当您从数据库中提取数据时,我会动态计算此列。
答案 1 :(得分:0)
Oracle没有内置的调度程序。有几种不同的方法可以解决这个问题。这是两个:
1)创建一个通过服务器的调度机制运行的sql脚本。对于Unix / Linux,这将是一个cron工作。对于Windows,这将是一个计划任务。
2)使用CREATE_JOB语法创建预定作业:
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'update_charges',
job_type => 'STORED_PROCEDURE',
job_action => 'MYSCHEMA.SOME_PKG.UPDATE_CHARGES',
start_date => '28-APR-08 12.00.00 PM Australia/Sydney',
repeat_interval => 'FREQ=DAILY;INTERVAL=1', /* every other day */
end_date => '20-NOV-13 12.00.00 PM Australia/Sydney',
job_class => 'batch_update_jobs',
comments => 'My new job');
END;
答案 2 :(得分:0)
以SQL表示,我认为您的算法是在下面的UPDATE
语句中实现的。每次算法运行时,您似乎都希望自己乘以total
;我假设这是我的误解或你的错字。似乎更有意义的是total
只是等于允许日期和当前日期之间的差异。
UPDATE CHARGES
SET Total = DATEDIFF(d, GETDATE(), AdmitDate)
WHERE DischargeDate IS NULL;
为确保此查询有效运行,您需要在DischargeDate
列上建立索引。
要在某个时间每天都这样做,你有几个选择。
如果你有自己的服务器代码运行,一种方法是让代码安排工作并随时执行它。如果您在服务器端架构中内置了良好的监控和管理功能。
另一种方法是运行chron
或at
作业,具体取决于您使用的操作系统。