Oracle 多版本控制

SESSION 1:



SQL> create table t 

  2  as

  3  select * from all_users;



Table created.





SQL> variable x refcursor

SQL> begin

  2  open :x for select * from t;

  3  end;

  4  /



PL/SQL procedure successfully completed.





SESSION 2:



SQL> delete from t;



37 rows deleted.



SQL> commit;



Commit complete.





SESSION 1:





SQL> print x



USERNAME			  USER_ID CREATED

------------------------------ ---------- ---------

TEST				       91 27-DEC-00

BI				       90 07-NOV-00

PM				       89 07-NOV-00

SH				       88 07-NOV-00

IX				       87 07-NOV-00

OE				       86 07-NOV-00

HR				       85 07-NOV-00

SCOTT				       84 13-AUG-09

OWBSYS_AUDIT			       83 13-AUG-09

OWBSYS				       79 13-AUG-09

APEX_030200			       78 13-AUG-09



USERNAME			  USER_ID CREATED

------------------------------ ---------- ---------

APEX_PUBLIC_USER		       76 13-AUG-09

FLOWS_FILES			       75 13-AUG-09

MGMT_VIEW			       74 13-AUG-09

SYSMAN				       72 13-AUG-09

SPATIAL_CSW_ADMIN_USR		       70 13-AUG-09

SPATIAL_WFS_ADMIN_USR		       67 13-AUG-09

MDDATA				       65 13-AUG-09

MDSYS				       57 13-AUG-09

SI_INFORMTN_SCHEMA		       56 13-AUG-09

ORDPLUGINS			       55 13-AUG-09

ORDDATA 			       54 13-AUG-09



USERNAME			  USER_ID CREATED

------------------------------ ---------- ---------

ORDSYS				       53 13-AUG-09

OLAPSYS 			       61 13-AUG-09

ANONYMOUS			       46 13-AUG-09

XDB				       45 13-AUG-09

CTXSYS				       43 13-AUG-09

EXFSYS				       42 13-AUG-09

XS$NULL 		       2147483638 13-AUG-09

WMSYS				       32 13-AUG-09

APPQOSSYS			       31 13-AUG-09

DBSNMP				       30 13-AUG-09

ORACLE_OCM			       21 13-AUG-09



USERNAME			  USER_ID CREATED

------------------------------ ---------- ---------

DIP				       14 13-AUG-09

OUTLN					9 13-AUG-09

SYSTEM					5 13-AUG-09

SYS					0 13-AUG-09



37 rows selected.



在前面的例子中,我创建了一个测试表T,并把ALL_USERS 表的一些数据加载到这个表中。然后在这

个表上打开一个游标。在此没有从该游标获取数据,只是打开游标而已。



要记住,Oracle 并不“回答”这个查询。打开游标时,Oracle 不复制任何数据,你可以想想看,

即使一个表有十亿条记录,是不是也能很快就打开游标?没错,游标会立即打开,它会边行进边

回答查询。换句话说,只是在你获取数据时它才从表中读数据。



在同一个会话中(或者也可以在另一个会话中;这同样能很好地工作),再从该表删除所有数据。甚

至用COMMIT 提交了删除所做的工作。记录行都没有了,但是真的没有了吗?实际上,还是可以通过游标获

取到数据。OPEN 命令返回的结果集在打开的那一刻(时间点)就已经确定。打开时,我们根本没有碰过表

中的任何数据块,但答案已经是铁板钉钉的了。获取数据之前,我们无法知道答案会是什么;不过,从游

标角度看,结果则是固定不变的。打开游标时,并非Oracle 将所有数据复制到另外某个位置;实际上是

DELETE 命令为我们把数据保留下来,把它放在一个称为undo 段(undo segment)的数据区,这个数据区

也称为回滚段(rollback segment)。


你可能感兴趣的:(oracle)