前两天发现一个问题,一个sql类似:select * from test where name<:f1<char[20]> and rownum<500 ,现网程序取回记录的顺序和本地sql取回的结果顺序不一致,很费解,怀疑是执行计划不一样,主要差别是,程序用了绑定变量,本地sql没有用绑定变量。而且在绑定变量情况下,当 rownum<200和rownum<500返回的结果顺序也不一致,查了半天也没头绪,高手帮忙解释下!!!

解决方案 »

  1.   

    oracle表的记录的堆形式存放的,具体返回记录的顺序要通过排序来保证
    如果数据一样,使用这种语句返回肯定是一样的,跟执行计划无关
    SELECT *
      FROM (SELECT * FROM test ORDER BY ord_col)
     WHERE NAME < 'sss' AND
           rownum < 500
      

  2.   

    oralce10g 会不会根据以前的执行情况,更改执行计划?我记不太清了
      

  3.   

    结果集的顺序应该跟执行计划无关。
    要实现准确排序必须得用order by,否则你的应用就没有一点可扩展性,任何一点小的变动,甚至无意的操作都会使结果集的顺序改变。
      

  4.   

    在sql中增加手动排序,但这样有些影响效率