有两个数据表是:
tb_dog: id,name,state;
tb_eat: id,dogid,eattime;
这条狗吃一次饭后3个小时就饿了。state是根据表tb_eat中的eattime判断生成的。为0是不饿,为1是饿了。
这个怎么做到啊?

解决方案 »

  1.   

    如果实时性不高,用job去扫时间超过3小时的,扫了之后改status
      

  2.   

    job?不是很明白,能让数据库智能生成吗不通过java类实现?
      

  3.   

    是的。写个存储过程来进行select和update。
    然后job调用这个存储过程。
      

  4.   

    create or replace aut_update_porc
    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;
      

  5.   


    最好不用job,这里本身是应用逻辑,也就是当你更新dog表里的state的时候,应该同时也去主动的操作eat表。
      

  6.   

     create table tb_dog(id number(20),name varchar(20),state number(1));  create table tb_eat(id number(20),dogid number(20),eattime timestamp);insert into tb_dog values(1,'a',0);
    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的逻辑里面实现。
      

  7.   

    嗯,有点懂了,谢谢大哥。具体的怎么写sql语句啊,比如说select之前调用job更新state。
      

  8.   

    见6楼,我已经给你写好了,你测试一下。这个job是每隔30秒去刷饿了的狗狗然后把状态改掉。
    如果你想间隔别的时间,你就把30/60/60/24的30改为你想要的总秒数。比如1小时你就用1/24.
      

  9.   

    我也这么觉得用job似乎是没必要的耗费
      

  10.   

    呵呵,如果不用job,那么从哪个入口去得出已经过了3小时需要改状态了呢?手动刷新?还是用java写一个后台去定时刷新?
    可能我以前job写多了吧,碰到这种定时任务之类的东东就老想着job,不用写程序,,,
    也可能是我太懒了,哈哈
      

  11.   

    噢,你用sqlplus命令行来执行
    保存的话你随便弄个文本文件啊。。