• Oracle11g R2学习系列 之五回闪


    Oracle里面有一个回闪的操作,这个貌似sql server是没有的。要使用这个功能,需要用到两个时间内部函数

    TIMESTAMP和TO_TIMESTAMP。其中,函数TO_TIMESTAMP的语法格式为:

    TO_TIMESTAMP('timepoint', 'format')

    另外我发现Oracle里的所有操作,如果不使用commit;的话,都是没起实际作用的。另起一个操作窗口就会发现数据还是完好的。如下图示,我依次输入的是:

    set time on
    select * from rollxsb;
    delete from rollxsb;
    select * from rollxsb;
    select * from rollxsb as of timestamp to_timestamp('2013-7-8 21:51:34','yyyy-mm-dd hh24:mi:ss');
    View Code

    set time ontimestamp

    请注意,我这个时间还没有敲commit;然后我用Oracle SQL Developer连接,再次输入select * from rollxsb;发现照样可以看到那三条记录,于是我再次返回SQL*PLUS并输入commit;这一次之后,我在SQLDevelper里面只能输入

    select * from rollxsb as of timestamp to_timestamp('2013-7-8 21:51:34','yyyy-mm-dd hh24:mi:ss');才能查询到那三条记录了。

    既然能够查询到,那么我想理所当然的可以用insert into 插回来了。sql server都支持的insert into 操作,作为数据库中的王牌Oracle没有道理没有这种语法,于是输入:

    insert into rollxsb select * from rollxsb as of timestamp to_timestamp('2013-7-8 21:51:34','yyyy-mm-dd hh24:mi:ss');

    发现数据已插回了rollxsb表了。这里同样的需要按F11或图示中的红圈以提交改动,才能在SQL*PLUS里面用select * from rollxsb看到那三条结果。

    sqldeveloper_commit

    感觉Oracle这里必须手动commit;才能提交改动的设计确认很高,防止很多人的误操作delete,不过千万记住,truncate是不支持这一操作的。如果你不幸在SQL*PLUS中执行了

    truncate table rollxsb;的话,那么很悲剧的告诉你,是无法回滚回来的,而且这个也无须commit;就立即生效了。最后,我用了表回滚也没有成功。

    alter table rollxsb enable row movement;
    flashback table rollxsb of timestamp to_timestamp('2013-7-8 21:51:34','yyyy-mm-dd hh24:mi:ss');

    所以truncate这一权限,慎开慎放为妙。

    另外我使用上面的语句在delete from rollxsb;之后执行,发现显示是执行成功,但数据是没有找回来。这说明表闪回,只是对表结构的回滚操作,对找回数据是没有用的。

  • 相关阅读:
    jquery.ajax,vue-resource,axios拦截器实现与携带cookie
    vs code 常用插件及说明
    Js/Jquery获取网页屏幕可见区域高度(转)
    vue的爬坑之路(三)之-----基于vue-cli的VueAwesomeSwiper轮播滑块插件的使用及常见问题(转)
    js中的深拷贝与浅拷贝
    沉浸式状态栏 关于状态栏高度的获取
    Cordova 常用命令及插件(转)
    video control
    canvas添加水印
    疑惑
  • 原文地址:https://www.cnblogs.com/SLKnate/p/oracle11g_rollback_commit.html
Copyright © 2020-2023  润新知