下面关于一个ROWNUMSQL语句,数据6万条左右时,发现数据取不到的现象.
2000条的时候,不会有这样的问题.
请各位大侠能谈谈什么可能性会造成这样的问题啊?SELECT
NO,
CONTRACT_ST_DATE
FROM (
SELECT
ROWNUM NO,
CONTRACT_ST_DATE
FROM MG_CONT) MG
WHERE MG.NO>:NUM*10000 AND MG.NO<=(:NUM+1)*10000;6万条数据的时候, :NUM分6次传值,分别是0、1、2、3、4、5。

解决方案 »

  1.   

    个人觉得是不是不规律的INSERT和DELETE会造成ROWNUM的值变化的原因?等待高手。。
      

  2.   

    先把:NUM替换成常量试试会不会是变量绑定问题
      

  3.   

    我测试了90万的记录没有发现lz的问题,你把你的6w记录移到其它表看看
      

  4.   

    你不用变量,直接用数字呢?SELECT 
    NO, 
    CONTRACT_ST_DATE 
    FROM ( 
    SELECT 
    ROWNUM NO, 
    CONTRACT_ST_DATE 
    FROM MG_CONT) MG 
    WHERE MG.NO>0 AND MG.NO <=10000; SELECT 
    NO, 
    CONTRACT_ST_DATE 
    FROM ( 
    SELECT 
    ROWNUM NO, 
    CONTRACT_ST_DATE 
    FROM MG_CONT) MG 
    WHERE MG.NO>10000 AND MG.NO <=20000;... 
      

  5.   

    1)我猜不是oracle的bug2)分页应该写成如下的样子,否则cbo用不到stopkey,性能会打折扣
    select *
      from (
                SELECT 
                    ROWNUM NO, 
                    CONTRACT_ST_DATE 
                FROM MG_CONT
               WHERE rownum <=(:NUM+1)*10000
            ) mg
      where MG.NO>:NUM*10000
      

  6.   

    感谢各位大侠的回答!to 枫の叶
    的确在循环中,:NUM改变值的同时,MG_CONT表是有不规律的DELETE操作,所以我想这会造成ROWNUM的错位.
    谢谢你的提醒!
    等到改好了,到客户那边测试OK了,再给你加分!まことにありがとうございます!