zoukankan      html  css  js  c++  java
  • Select中的ROWNUM

    Select中的ROWNUM

    最近在项目中遇到了一个关于ROWID理解不足而产生的BUG。现总结如下:

    环境

    • DB:Oracle
    • AP:Weblogic

    BUG现象

    程序是这样的有一个打印的机能,是按照某一个顺序进行顺次打印。BUG的描述也很简单,就是顺序不对。

    BUG解析

    这BUG解析不复杂,一看顺序不对,肯定就是SQL那错了呗。但看了一下程序处理很特别,是有个SQL文,SQL文里也有Order By,但不是把数据全取出来,而是每次只取第一条。通过循环无限的去取。可能是怕数据太多了内存会溢出吧。但在抽取的时候他使用了ROWNUM这个伪列,错也由此而来。

    总结

    我们先说一下ROWNUM这个虚拟列的特征:

    • 排序前将检索出来的结果的记录序号设定到ROWNUM这个列中。
    • 可以用来限制WHERE检索的记录数
    • 含有ROWNUM的条件会在所有条件的最后进行解析。

    看到这大家应该明白,我错在哪了吧。就是ROWNUM的值是排序前的值,也就是说数据程序中存在ORDERY BY,并且使用了ROWNUM<5这种条件的话,并且是在同一层级的SQL中,那么得到的结果就一定是错的。解析方法也很简单。就是将ORDER BY的程序做为子查询,也就是将SQL再套一层就是了。

    参考文献

    1.ROWNUM 擬似列

  • 相关阅读:
    如何快速生成API并进行测试
    如何开始使用接口自动化测试脚本
    一些网上密码学资源(转载)
    手把手硬件电路详细设计过程(转载)
    触发器(trigger)的作用???
    去面试字节跳动啦!
    2020年白领年终奖报告来了,平均值为7826元
    12 个顶级 Bug 跟踪工具
    接口的幂等性怎么设计?
    魔改一波合成大西瓜!代码已开源~
  • 原文地址:https://www.cnblogs.com/tjpanda88/p/2028811.html
Copyright © 2011-2022 走看看