我的oracle数据库中有一个表是实时的往里插入数据的,大约1秒钟有5--10条。(此表只保留一天的数据,当天凌晨会清空)
我做了个程序,定时从该表中查询最新的插入的数据,3秒查询一次,将最新插入的数据取出来,如何写这个SQL语句?1.我的表里没有可以判断是最新的列,所以没有办法根据列来查询,而且我也不可能改动表结构。
2.如果查询系统时间3秒内的数据也不太显示,我的程序发布和数据库不在一台服务器,加上运算时间,加上两个服务器之间有点时间差,有可能有部分数据遗漏,查询不出来。我想法是这样的,每次查询出最新的数据,以最后一个最新的数据为下次查询的参照,当下次查询的时候时,根据上次最新的查询,有没有办法,或是oracle有没有记录什么的?希望得到最节省资源的SQL语句,谢谢了。

解决方案 »

  1.   

    LZ你试试看跟踪rownum怎么样,每次保存一个rownum,再在数据库查找count(*)总记录条数,于是你就可以找到最后几条数据了,rownum和count(*)之间的
    我纯属YY,不知道结果的说
      

  2.   

    你有ID字段吗 ID 是seq吗  如果是 的话 order by Id DESC  拿到第一条数据
      

  3.   


    有ID,但是不可用,我有几十个前段,ID是根据前段的系统时间再加上其他一些配置制定的,各个前段时间没法做到同步,所以ID不可用
      

  4.   


    不可以的,rownum是根据ID排序的吧,我的ID是根据前段设备的时间,不是自动增长的,有可能下一秒来的数据,还不如上一秒来的时间晚呢,谢谢你的回答
      

  5.   

    不能改表结构,加个新表建个触发器,里面放主键跟系统时间来判断。
    另外ORACLE好像还有个审计功能,但是非常耗效率
      

  6.   

    加一个时间字段deftime,默认值为sysdate,也就是保存你插入的时间。
    select * from (select * from yourtab order by deftime desc) where rownum = 1;
      

  7.   

    systimestamp  精确到毫秒
      

  8.   

    可以取max(rowid)来试一下,但是rowid还是有局限性的,如果中间过程做个更新和删除操作,max(rowid)取出的并不一定是最后的一条数据了,如果没有的话还是可以的!--呃!rowid应该是不行的,你要不断的做删除操作,还是加入一个列吧,然后从sequence中取值,越大越新
      

  9.   


    既然你能把上次的当做参考,那是说有某个东西是能区分出来的,是用大小区分还是别的办法?只要能区分那应该是可以把这个条件加到 where 里面去吧?
      

  10.   

    可参考一法:
    若原表为tabName_A,则建立一个同结构的表tabName_B,为表tabName_A建立一个触发器,将新记录插入到表tabName_B,如:
    create or replace trigger tr_tabName_A
      after insert on tabName_A
      for each row
    begin
      insert into tabName_B
      (ID,
       operator)
      Values
      (:new.ID,
       :new.Operator);
    end tr_tabName_A;每次查询表tabName_B的记录,处理后将表tabName_B相应记录删除,这样tabName_B总保持后插入的记录
      

  11.   

    楼主可以在目标表上建一个Insert触发器,
    将Insert到该表的记录都转移到你要的表里.