有两个数据表是:
tb_dog: id,name,state;
tb_eat: id,dogid,eattime;
这条狗吃一次饭后3个小时就饿了。state是根据表tb_eat中的eattime判断生成的。为0是不饿,为1是饿了。
这个怎么做到啊?
tb_dog: id,name,state;
tb_eat: id,dogid,eattime;
这条狗吃一次饭后3个小时就饿了。state是根据表tb_eat中的eattime判断生成的。为0是不饿,为1是饿了。
这个怎么做到啊?
解决方案 »
- oracle时间段怎么转换成月份
- ORA-00932 精确到毫秒级的时间差怎样实现(急等)
- Oracle 存储过程中如何用变量作为字段和表名的问题
- sql语句,有点难
- oracle 如何跟踪执行的sq了语句 从web传过来的
- 用OraOLEDB.Oracle链接Oracle数据库,SQL语句参数用那个符号代替?
- 刷新索引的问题?再线等。
- 非常小的问题,大侠们赐教啊
- 我在9i下按照用户将数据导出,移去方案下的相关用户的表,再导入数据怎么看不见方案下的表了?请教大伙.
- 怎样把WIN2000下的ORCAL数据库数据导入到LINUX下的ORCAL数据库中
- 2句 sql语句比较 ,数据库oracle 里面的 , 很急
- 谁能帮我看下下面的SQL 语句 是怎么用的
然后job调用这个存储过程。
ascursor c is select tb_eat;
beginfor record in c loopif((record.eattime+3/24) <= sysdate)then
update tb_dog set state=1 where id=record.dogid;
else
update tb_dog set state=0 where id=record.dogid;
end if;end loop;commit;end aut_update_porc;---job
var num number;
begin
DBMS_JOB.SUBMIT(:num, 'aut_update_porc;',sysdate,'sysdate+(3/24)');
commit;
end;
最好不用job,这里本身是应用逻辑,也就是当你更新dog表里的state的时候,应该同时也去主动的操作eat表。
insert into tb_eat values(1,1,systimestamp-3);create or replace procedure upd_dog_status
as
begin
update tb_dog set state=1 where id in(
select distinct dogid from tb_eat where (systimestamp-3/24)>eattime
);
end upd_dog_status;
/--30秒扫描一次
VARIABLE jobno number;
begin
DBMS_JOB.SUBMIT(:jobno,
'upd_dog_status;',
SYSDATE,'SYSDATE + 30/60/60/24');
commit;
end;
/
对4楼的有不同看法,不饿状态的修改,应该在插入tb_eat的逻辑里面实现。
如果你想间隔别的时间,你就把30/60/60/24的30改为你想要的总秒数。比如1小时你就用1/24.
可能我以前job写多了吧,碰到这种定时任务之类的东东就老想着job,不用写程序,,,
也可能是我太懒了,哈哈
保存的话你随便弄个文本文件啊。。