现有一表A,该表中记录数不断增加,每天清空一次,表中记录没有流水号、序号等字段,要将表中数据读出,方法是:每隔几分钟读一次表,要求只读新增的没有读过的记录,读过的就不再访问,对表只有读的权限,不可以写及做任何其他动作。我本来利用了表中的rowid来判断记录是否读过,被读过的记录的rowid被记下为value,再再一次读记录时选择读rowid>value的记录。可是在运行一段时间后发现有时value值是当前表中没有的,而且大于表中所有记录的rowid。请问这是为什么?我怎么解决这样的问题?

解决方案 »

  1.   

    rowid 可能会被重用.
    比如一条记录被删除后,它的rowid就被释放了,再插入时又被分配了.
      

  2.   

    建议在表中增加字段, 用默认sysdate的方式记录插入时间,读取的时候可以根据该字段判断是否需要重复读取.
      

  3.   

    升级到oracle 10g才能解决你的问题
    10g可以直接用sql找出某个时间范围内表中新增加的行
      

  4.   

    另外在建一张表,含有你的表的主健和sysdate
    写一个触发器,将增加到原来表中的纪录的主健和sysdate插入到新表中
    查询的时候根据这两个表进行查询
      

  5.   

    因为要删除数据,rowid的物理位置可能被新的数据重用.,出现你的情况,建议是不是考虑增加一标志字段,根据时间段来插入标志值/
      

  6.   

    每天清空一次, 当然不能用rowid
    怎么办得看看表结构
      

  7.   

    请问楼上rownum是什么东东?能介绍详细些吗?
      

  8.   

    rownum是伪列,是oracle加在表中的一条记录的序号,可是用rownum,不能精确定位到一条记录啊,还是要考虑一下
      

  9.   

    如果是每天清空一次,可以这样做:你先要在数据库中建立一张结构和你要读取数据那张表一样的表,假若新表为表C,原来的表为表A。当你每天第一次读取时,就将读取的记录插到表C中,再次读取时,将表A的记录与表C的记录用差运算,读取最新的记录,同时将差运算的结果插入到表C,采用这种方式就可以每次读最新的数据。你可以写成存储过程和触发器。执行的效率与你表中的数据量有关。