zoukankan      html  css  js  c++  java
  • 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;之后执行,发现显示是执行成功,但数据是没有找回来。这说明表闪回,只是对表结构的回滚操作,对找回数据是没有用的。

  • 相关阅读:
    IE8发送ajax请求无效
    Qt 桌面服务 QDesktopServices
    Qt 排序 QSort
    使用ehcache缓存可变对象时的注意事项
    Golang微服务入门到精通之路-1-Go之初体验
    机械革命 Code01 笔记本激活 Win10 方法
    IM技术分享:万人群聊消息投递方案的思考和实践
    零基础入门:基于开源WebRTC,从0到1实现实时音视频聊天功能
    剑指 Offer 28. 对称的二叉树
    idea使用
  • 原文地址:https://www.cnblogs.com/SLKnate/p/oracle11g_rollback_commit.html
Copyright © 2011-2022 走看看