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

原文地址:https://www.cnblogs.com/SLKnate/p/oracle11g_rollback_commit.html