转自 http://blog.chinaunix.net/uid-8504518-id-3325718.html

今天开发人员问我如何快速并方便的查出一张表最近被更改的记录,这个需求很简单,由于是查最近被更改的数据,查回滚段就可以,下面是我做的小实验。

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)

ORACLE查询表最近更改的数据 VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE的更多相关文章

  1. ORACLE查询表最近更改数据的方法

    修改项目时,涉及到了Oracle中许多表的修改(包括:增加.删除字段,修改注释等).由于开始没有进行记录,造成在上测试机时,忘记了具体修改过哪些表了.后来在网上查找了一些资料,例如: 1.select ...

  2. Oracle 查询表中字段里数据是否有重复

    1.查找单个字段 select 字段名,count(*) from table group by 字段名 having count(*) > 1 2.查找组合字段: SELECT TEST_NA ...

  3. Oracle查询表里的重复数据方法:

    一.背景 一张person表,有id和name的两个字段,id是唯一的不允许重复,id相同则认为是重复的记录. 二.解决 select id from group by id having count ...

  4. oracle查询表数据并重新插入到本表

      oracle查询表数据并重新插入到本表 CreateTime--2018年5月17日10:30:10 Author:Marydon 1.情景描述 --查询表中数据 SELECT * FROM at ...

  5. 四、Oracle loop循环、while循环、for循环、if选择和case选择、更改读取数据、游标、触发器、存储过程

    数据库的设计(DataBase Design): 针对于用户特定的需求,然后我们创建出来一个最使用而且性能高的数据库! 数据库设计的步骤: 01.需求分析 02.概念结构设计 03.逻辑结构设计 04 ...

  6. 针对Oracle数据库表中的数据的常见操作

    1.查询表中所有数据 select * from 表名; 例:select * from stu; 2.查询的同时修改表中数据 select * from 表名  for update; 例:sele ...

  7. oracle 查询表名以及表的列名

    oracle 查询表名以及表的列名的代码.   1.查询表名: 代码如下: select table_name,tablespace_name,temporary from user_tables [ ...

  8. oracle 查询表的大小,表空间的使用情况,默认表空间

    oracle 查询表的大小,表空间的使用情况,默认表空间 oracle 查询表的大小,表空间的使用情况,默认表空间 --查看某张表占用磁盘空间大小 ( 表名大写 ) Select Segment_Na ...

  9. 类型:Oracle;问题:oracle 查询表详细信息;结果:oracle查询表信息(索引,外键,列等)

    oracle查询表信息(索引,外键,列等) oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息,索引信息查询SQL如下,希望对大家有所帮助: 1.查询出所有的用户表sel ...

随机推荐

  1. 剑指offer五十四之字符流中第一个不重复的字符

    一.题目 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...

  2. 数据?算法-> which is important?

    谷歌的强不是强在 PageRank 算法,而在于它是第一个在排名时把链接——而不只是文字和标题——考虑进去的.又以自己教的数据挖掘课为例.他让学生以 Netflix 用户对一万八千多部电影的打分为基础 ...

  3. 漫谈NIO(2)之Java的NIO

    1.前言 上章提到过Java的NIO采取的是多路IO复用模式,其衍生出来的模型就是Reactor模型.多路IO复用有两种方式,一种是select/poll,另一种是epoll.在windows系统上使 ...

  4. ActiveMQ学习--002--Topic消息例子程序

    一.非持久的Topic消息示例 注意 此种方式消费者只能接收到 消费者启动之后,发送者发送的消息. 发送者 package com.lhy.mq.helloworld; import java.uti ...

  5. 【Java并发编程】:并发新特性—障碍器CyclicBarrier

    CyclicBarrier(又叫障碍器)同样是Java5中加入的新特性,使用时需要导入Java.util.concurrent.CylicBarrier.它适用于这样一种情况:你希望创建一组任务,它们 ...

  6. ubuntu安装maven

    1.安装maven前需要安装JDK 2.下载mavenapache-maven-3.3.9-bin.tar.gz 3.解压maven到当前目录tar -zxvf apache-maven-3.3.9- ...

  7. java.io.IOException: Could not find status of job:job_1534233312603_0002

    hive执行插入数据操作 报错: 在hive console里面输入: set  hive.jobname.length=20; 再次执行好了:

  8. android studio生成aar包并在其他工程引用aar包

    1.aar包是android studio下打包android工程中src.res.lib后生成的aar文件,aar包导入其他android studio 工程后,其他工程可以方便引用源码和资源文件 ...

  9. redis-springboot-redistemplate更改序列化方式

    redisTemplate 默认的序列化方式为 jdkSerializeable, StringRedisTemplate的默认序列化方式为StringRedisSerializer 可以通过手动配置 ...

  10. 代码查看php是否已开启rewrite功能模块

    通过php代码来查询,是否把rewrite模块打开了 <?php $result = apache_get_modules(); if(in_array('mod_rewrite', $resu ...