文档章节

ORACLE查询表最近更改的数据

茄克闹
 茄克闹
发布于 2015/06/04 11:33
字数 1017
阅读 175
收藏 11
SQL> create table test(id number,name varchar2(10),gender varchar2(5));
表已创建。
SQL> insert into test values(1,'宋春风','男');
已创建 1 行。
SQL> insert into test values(2,'叶民','男');
已创建 1 行。
SQL> insert into test values(3,'白冰','男');
已创建 1 行。
SQL> insert into test values(4,'方巍森','男');
已创建 1 行。
SQL> insert into test values(5,'孙书祯','男');
已创建 1 行。
SQL> insert into test values(6,'史波','男');
已创建 1 行。
SQL> commit;
提交完成。

利用下面的SQL就可以查处最近更改的数据。

SQL> SELECT ID,NAME,VERSIONS_STARTTIME,VERSIONS_ENDTIME,VERSIONS_OPERATION 
FROM TEST VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE WHERE 
VERSIONS_STARTTIME IS NOT NULL ORDER BY VERSIONS_STARTTIME DESC;
        ID NAME   GENDE VERSIONS_STARTTIME        VERSIONS_ENDTIME          V
---------- ------ ----- ------------------------- ------------------------- -
         6 史波   男    30-11月-11 04.02.28 下午                            I
         5 孙书祯 男    30-11月-11 04.02.28 下午                            I
         1 宋春风 男    30-11月-11 04.02.28 下午                            I
         3 白冰   男    30-11月-11 04.02.28 下午                            I
         2 叶民   男    30-11月-11 04.02.28 下午                            I
         4 方巍森 男    30-11月-11 04.02.28 下午                            I
已选择6行。

修改几条数据和接下来的查询做对比。

SQL> UPDATE TEST SET GENDER='女' WHERE NAME='孙书祯';
已更新 1 行。
SQL> COMMIT;
提交完成。
SQL> UPDATE TEST SET GENDER='女' WHERE NAME='史波';
已更新 1 行。
SQL> COMMIT;
提交完成。

再次查询,被修改的数据就可以看到被修改和修改前的数据。

SQL> SELECT ID,NAME,GENDER,VERSIONS_STARTTIME,VERSIONS_ENDTIME,
VERSIONS_OPERATION FROM TEST VERSIONS BETWEEN TIMESTAMP MINVALUE AND 
MAXVALUE WHERE VERSIONS_STARTTIME IS NOT NULL ORDER BY 
VERSIONS_STARTTIME DESC;
        ID NAME   GENDE VERSIONS_STARTTIME        VERSIONS_ENDTIME          V
---------- ------ ----- ------------------------- ------------------------- -
         6 史波   女    30-11月-11 04.15.07 下午                            U
         5 孙书祯 女    30-11月-11 04.14.31 下午                            U
         4 方巍森 男    30-11月-11 04.02.28 下午                            I
         3 白冰   男    30-11月-11 04.02.28 下午                            I
         2 叶民   男    30-11月-11 04.02.28 下午                            I
         1 宋春风 男    30-11月-11 04.02.28 下午                            I
         6 史波   男    30-11月-11 04.02.28 下午  30-11月-11 04.15.07 下午  I
         5 孙书祯 男    30-11月-11 04.02.28 下午  30-11月-11 04.14.31 下午  I
已选择8行。

再修改几条数据后后查询。

SQL> delete from test WHERE NAME='史波';
已删除 1 行。
SQL> delete from test WHERE NAME='孙书祯';
已删除 1 行。
SQL> commit;
提交完成。
SQL> SELECT ID,NAME,GENDER,VERSIONS_STARTTIME,VERSIONS_ENDTIME,
VERSIONS_OPERATION FROM TEST VERSIONS BETWEEN TIMESTAMP MINVALUE AND 
MAXVALUE WHERE VERSIONS_STARTTIME IS NOT NULL ORDER BY 
VERSIONS_STARTTIME DESC;
        ID NAME   GENDE VERSIONS_STARTTIME        VERSIONS_ENDTIME          V
---------- ------ ----- ------------------------- ------------------------- -
         5 孙书祯 男    30-11月-11 04.26.02 下午                            D
         6 史波   男    30-11月-11 04.26.02 下午                            D
         6 史波   女    30-11月-11 04.15.07 下午  30-11月-11 04.19.08 下午  U
         5 孙书祯 女    30-11月-11 04.14.31 下午  30-11月-11 04.19.08 下午  U
         2 叶民   男    30-11月-11 04.02.28 下午                            I
         3 白冰   男    30-11月-11 04.02.28 下午                            I
         4 方巍森 男    30-11月-11 04.02.28 下午                            I
         5 孙书祯 男    30-11月-11 04.02.28 下午  30-11月-11 04.14.31 下午  I
         1 宋春风 男    30-11月-11 04.02.28 下午                            I
         6 史波   男    30-11月-11 04.02.28 下午  30-11月-11 04.15.07 下午  I
已选择10行。

通过以上小实验可以看出,VERSIONS_STARTTIME是数据被修改的起始时间,VERSIONS_ENDTIME是数据被修改后新数据的有效时间,也就是VERSIONS_STARTTIME和VERSIONS_ENDTIME时间段内,这条数据再没被修改过,如果VERSIONS_ENDTIME为空,就说明这天记录从VERSIONS_STARTTIME时间起再没被修改过。VERSIONS_OPERATION是修改状态,I代表INSERT,U代表UPDATE,D代表DELETE。此时如果想回滚INSERT的数据,只需要DELETE反向操作即可,如果想回滚UPDATE操作,将数据反向UPDATE回去即可,比如本实验已经可以看到进行UPDATE操作的是NAME为史波和孙书祯的两条记录,而且也可以看到进行UPDATE之前的数据他们的性别是男,所以只需要在做个反向UPDATE,将性别该为男即可实现回退,如果要回滚DELETE操作,同样做个INSERT操作,将删除的数据在插回去即可。
注:此SQL只能查询到回滚段内的信息,超出回滚段范围这个SQL就无能为力了,需要借助LOGMGR工具挖掘日志了(详见http://www.dbdream.org/?p=149)。

本文转载自:

茄克闹
粉丝 2
博文 7
码字总数 372
作品 0
福州
高级程序员
私信 提问
MyBatis练习:查询表中单个数据列中用分隔符隔开的数据

我的电脑操作系统版本为Win7旗舰版(ServicePack1),Oracle版本为Oracle11g,PL/SQL版本为7.0.1.1066 程序使用的jar包有:mybatis-3.2.2.jar、ojdbc14-10.2.0.2.0.jar 本例中使用的配置文件...

北风其凉
2016/05/21
701
0
hibernate中如何查询oracle中最近的一条数据库记录

在hibernate中如何查询oracle数据库中的某个表中的最近生成的一条信息?这个表在项目中有对应的类,我想把数据库中的最近一条信息查出来比如下面的HQL 语句 select * from (select t.create...

码上中国博客
2015/07/07
1K
3
20_Oracle_Admin_移动表空间的数据文件以及删除表空间

一、使用ALTER TABLESPACE来移动数据文件 移动数据文件在调整表空间大小时有可能会用到,使用的是ALTERTABLESPACE命令。但是要注意的是,在进行此项操作之前,首先应将tablespace 设为offli...

wuyeyoulanjian
2018/06/26
0
0
ORACLE的ORDERBY非稳定的排序

提一个问题: oracle在order by 排序时,是稳定排序算法吗? 发现用一个type进行排序后,做分页查询,第一页的数据和第二页的数据有重复 怀疑是order by 时,两次排列的顺序不一致 看到业务描...

王小明123
2012/11/02
1K
6
SQL优化二(SQL性能调优)

一·、前言:这篇博文内容非原创,是我们公司的架构师给我们做技术培训的时候讲的内容,我稍微整理了下,借花献佛。这篇博文只是做一个大概的科普介绍,毕竟SQL优化的知识太大了,几乎可以用...

jmcui
2017/08/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

技术分享 | MySQL 8.0:字符集从 utf8 转换成 utf8mb4

作者:胡呈清 整理 MySQL 8.0 文档时发现一个变更:默认字符集由 latin1 变为 utf8mb4。想起以前整理过字符集转换文档,升级到 MySQL 8.0 后大概率会有字符集转换的需求,在此正好分享一下。...

爱可生
13分钟前
2
0
不管单机还是集群的限流实现已经给你准备好了

限流算法 计数器算法 维护一个counter,规定在单位时间内counter的大小不能超过最大值,每隔固定时间就将counter的值置零。如果这个counter大于设定的阈值,那么系统就拒绝请求 漏桶算法 维护...

阿提说说
24分钟前
3
0
文件管理

通过CLI登录进行文件管理 .表示当前目录,..表示父目录,具有隐藏文件。支持缩写与TAB键补全 1、目录操作 pwd#打印工作目录 cd <directory>#改变工作目录 dir [/all][<directory>]#查看目录内...

悠悠子佩
26分钟前
3
0
Netty学习笔记(10)——Netty中的Channel组件

1. Channel的功能 1. 与NIO中的Channel一样,它实现了网络操作的抽象类,聚合了一系列的网络IO功能,包括读写数据、建立连接、关闭连接等功能。通过外观模式,将数据读写、连接建立与断开等操...

江左煤郎
30分钟前
2
0
二叉树的深度

从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 public int TreeDepth(TreeNode root) { return root == null ? 0 : 1 + Math.max(Tree...

Garphy
38分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部