oracle取数据库中最新的一条数据可能会遇到的bug(两种情况)

记一次 开发中遇到的坑:

第一种情况 rowid

select * from table where rowid=(select max(rowid) from table )

这种方式是取最大的rowid作为最新的数据,但是有一个隐患 :数据库一旦有删除操作,rowid不能保证每次都是递增的!即max(rowid)并不一定就是最新的数据,尽管可能不会每次复现 但这个问题是绝对存在的!

第二种情况 使用rownum (或相同思路)

select t.* from (select ti.sysno,ti.cr_date from t_insurance ti order by ti.selldatetime desc ) t where rownum = 1 

这有很大一个问题,如果排序字段数据库使用的是date类型,而且存在时分秒刚好相同的数据(尤其高并发项目中),我们子查询语句中 的确可以准确的 order by desc出来,但是一旦外层套了一层select ,查出来的很可能就不是子查询里面的第一条数据,详细如图:
11:35:25存在两条数据 执行选中的查询sql,

但是 当我们加了一层select,可以看到 已经不是上面的第一条数据了

类似的,不管怎么写的花里胡哨,如下sql,子查询里面 row_row = 1时,sysno确实为3126 1018 0001 5Z14,但是外面套了一层select 结果也变了

 select * from
(select t.sysno,
  t.cr_date,
  row_number() over(order by t.cr_date desc) row_row from t_insurance t)
  where row_row = 1

同理 用with temp as 也是一样的情况,取不到最新的结果。

解决方法:

暂时没有从写什么高级的sql语句层面想到好的办法,(如果有大佬有好的方法,希望可以指点一二)

提供一些思路:如果项目没有上生产 或者说是小项目,那还可以追加自增列,或者数据库使用时间戳类型,但是上了生产 改动数据库是大忌。

一般的,数据表中还会有其它的字段可以作为辅助排序,例如一段时间内的单号是递增的 那么可以多个字段排序 例如 order by date desc,orderNo desc ,(我是通过这种方式解决的,但还是不治根 万一哪天遇到数据库没其他辅助排序字段 问题还是得不到解决)

实在不行 就根据实际业务 看看能不能对时间加限制(如果数据量不大 不加也罢),select * from table where date >=xxxx order by desc date ,然后把一堆数据查询出来,在代码里面list.get(0)取出第一条数据。

到此这篇关于oracle取数据库中最新的一条数据可能会遇到的bug的文章就介绍到这了,更多相关oracle取数据库中最新的一条数据内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PLSQL Developer连接Oracle11g 64位数据库配置详解(图文)

    最近换了台64bit的电脑,所以oracle数据库也跟着换成了64bit的,不过问题也随之产生,由于plsql developer暂时没有64bit版本的,所以无法连接到64bit的oracle上,经过一番折腾,终于成功连接到数据库上,现记录下配置过程,以便查看. 1. 下载instantclient-basic-win32-11.2.0.1.0(oracle官网下载地址:http://www.oracle.com/technetwork/topics/winsoft-085727.html, 

  • PLSQL Developer连接oracle数据库配置教程

    需要安装的工具: 一:Oracle的下载安装: 下载地址: http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads/index.html 详细安装此处不做赘余描述,需要注意的是下载好的两文件需解压至同一目录下以及环境变量的路径配置(尽量使用英文字符路径): 二.安装32位Instant Client 下载32位Instant Client(轻量级的客户端),作为本地Oracle环境 (旧版本里64位In

  • Oracle数据库ORA-12560错误问题的解决办法

    官网中关于ORA-12560的解释: ORA-12560: TNS:protocol adapter error Cause: A generic protocol adapter error occurred. Action: Check addresses used for proper protocol specification. Before reporting this error, look at the error stack and check for lower level

  • PL/SQL登录Oracle数据库报错ORA-12154:TNS:无法解析指定的连接标识符已解决(本地未安装Oracle需要连接服务器上的)

    ORA-12154:TNS:无法解析指定的连接标识符 ORA-12154:TNS:无监听程序 错误分析一.PL/SQL 客户端登录到数据库,如果配置错误会有以上错误,如下图. 这个错误主要是pl/sql客户端的tnsnames.ora配置错误,或者是输入 database选项错误. 错误分析二.未配置环境变量 所以解决问题之前一定要配置环境变量TNS_ADMIN path添加:E:\PLSQL Developer(64)\instantclient_11_2 配置环境变量就是为了让PL/SQL

  • Shell脚本连接oracle数据库的实现代码

    最近研究了一下怎样使用shell 脚本连接数据库,然后执行查询语句.这样对于需要定时执行的脚本,我们可以建个 crontab 去定时执行. 先介绍一下客户端的安装: linux 环境需要用 sqlplus 客户端去连接oracle 数据库,首先我们需要确认有没有安装:which sqlplus如果没有安装就需要先安装一下,安装步骤如下: 到oracle 官网下载,之后安装以下两个模块: rpm -ivh oracle-instantclient11.2-basic-11.2.0.3.0-1.x8

  • plsql 连接oracle数据库详细配置的方法步骤

    第一次用这种方式连接oracle数据库,自己百度搞了快两个小时才弄好,百度的资源也不靠谱,看了好多都不完整,搞完了报各种错误,各种连不上数据库,自己整理下资料,希望给其他的同行予以借鉴,不能保证每个人都能操作成功!毕竟有时真的得看人品了,呵呵! 第一步:先安装plsql客户端,plsql客户端是必须的,我的是同事给的plsql(英文版客户端)安装很简单(下一步下一步.......)就不做说明! 第二步:下载 oracle client我的是64位操作系附赠下载地址:https://www.jb5

  • Oracle数据库服务器修改操作系统时间的注意事项详解

    Oracle 数据库服务器修改操作系统时间的注意事项: 对单机或者ha 1.对数据库本身而言,其实是没有影响的.因为scn不依赖于os时间 2.对app(应用程序)而言,若是app中使用了sysdate之类的,那确实是有影响的. 基于这个情况,我们一般推荐:改os时间 不往之前的时间去改,而是往今后的时间去改. 推荐:安装oracle10g时候注意事项&修改oracle数据库字符集编码 [安装oracle10g时候注意事项:1. 关闭网络连接2.--修改oracle数据库字符集编码:先用syst

  • oracle取数据库中最新的一条数据可能会遇到的bug(两种情况)

    记一次 开发中遇到的坑: 第一种情况 rowid select * from table where rowid=(select max(rowid) from table ) 这种方式是取最大的rowid作为最新的数据,但是有一个隐患 :数据库一旦有删除操作,rowid不能保证每次都是递增的!即max(rowid)并不一定就是最新的数据,尽管可能不会每次复现 但这个问题是绝对存在的! 第二种情况 使用rownum (或相同思路) select t.* from (select ti.sysno

  • ajax 数据库中随机读取5条数据动态在页面中刷新

    不能用数据库中的Top,后面发现了用这样一个方法可以实现...现就这个方法总结写了一个页面.有兴趣的朋友们可以一起学习下.... 前台代码:  复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ajaxRandomData.aspx.cs" Inherits="ajaxRandomData" %> <!DOCTYPE html

  • postgreSQL数据库 实现向表中快速插入1000000条数据

    不用创建函数,直接向表中快速插入1000000条数据 create table tbl_test (id int, info text, c_time timestamp); insert into tbl_test select generate_series(1,100000),md5(random()::text),clock_timestamp(); select count(id) from tbl_test; --查看个数据条数 补充:postgreSQL 批量插入10000条数据

  • Python实现爬取网页中动态加载的数据

    在使用python爬虫技术采集数据信息时,经常会遇到在返回的网页信息中,无法抓取动态加载的可用数据.例如,获取某网页中,商品价格时就会出现此类现象.如下图所示.本文将实现爬取网页中类似的动态加载的数据. 1. 那么什么是动态加载的数据? 我们通过requests模块进行数据爬取无法每次都是可见即可得,有些数据是通过非浏览器地址栏中的url请求得到的.而是通过其他请求请求到的数据,那么这些通过其他请求请求到的数据就是动态加载的数据.(猜测有可能是js代码当咱们访问此页面时就会发送得get请求,到其

  • vue 如何删除数组中的某一条数据

    目录 删除数组中的某一条数据 删除普通数组 删除数组对象 使用splice()删除数组中的一个数据 删除数组中的某一条数据 删除普通数组 let arr = [1,2,3,4,5]; //方法一 let index = arr.indexOf('3'); arr.splice(index, 1) //打印结果 [1,2,4,5] //方法二 let index = arr .findIndex(item => {             if (item == '3') {          

  • vue3中的对象时为proxy对象如何获取值(两种方式)

    目录 第一种获取target值的方式: 第二种获取target值 PS:vue3中获取proxy包裹的数据 前言 一.具体问题 二.解决办法 使用vue3.0时,因为底层是使用proxy进行代理的所以当我们打印一些值得时候是proxy代理之后的是Proxy对象,Proxy对象里边的[[Target]]才是真实的对象. 第一种获取target值的方式: 通过vue中的响应式对象可使用 toRaw() 方法获取原始对象 //第一种获取target值的方式,通过vue中的响应式对象可使用toRaw()

  • angular中实现li或者某个元素点击变色的两种方法

    本文介绍了angular中实现li或者某个元素点击变色的两种方法,分享给大家,希望对大家有帮助 先说一种最直接了当的不需要js控制. 方法一:直接在用ng-class就可以控制: <p ng-click="state=1;" ng-class="{active:state==1}">浮伤年华</p> <p ng-click="state=2;" ng-class="{active:state==2}&quo

  • Docker中数据卷(volume)管理的两种方式

    上篇文章给大家介绍过 docker基础知识之挂载本地目录的方法 ,今天给大家介绍Docker中数据卷(volume)管理的两种方式,具体内容如下所示: 什么是数据卷 数据卷( volume ):volume是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供便利. 为什么要用数据卷 Docker分层文件系统存在的问题: Docker的镜像是由一系列的只读层组合而来的,当启动一个容器时, Docker加载镜像的所有只读层,并在最上

  • postgresql 实现取出分组中最大的几条数据

    看代码吧~ WITH Name AS ( SELECT * FROM ( SELECT xzqdm, SUBSTRING (zldwdm, 1, 9) xzdm, COUNT (*) sl FROM sddltb_qc WHERE xzqdm IN ('130432', '210604') GROUP BY xzqdm, SUBSTRING (zldwdm, 1, 9) ) AS A ORDER BY xzqdm, xzdm, sl ) SELECT xzqdm, xzdm, sl FROM (

  • asp.net中执行存储数据操作时数据被自动截取的一种情况

    今天在做东西的时候,发现一个很奇怪的问题,数据库(SqlServer)中的字段设置的类型为ntext,但是保存的数据总是很短,开始以为在程序的某段设置了长度限制,在设置了断点跟踪调试发现穿递的数据很正常,但是在执行了存储操作以后保存的内容总是很短,数了数保存的字符个数为16个,数据库中设置的该字段类型ntext的长度也为16,于是想是不是数据库的bug,就在查询分析器里写insert语句进行测试,结果发现保存的内容很正常,这样问题肯定在程序当中,最后检查到在构造SqlCommand命令对象的参数

随机推荐