在11.2中,Oracle数据库引入的版本的概念,这为应用程序的升级提供了极大的方便。

这篇简单描述版本的实现和查询方式。

前一篇简单描述了版本,下面接着上面的例子看看Oracle是如何实现这个功能的:

SQL> select synonym_name, table_name

2  from user_synonyms;

SYNONYM_NAME                   TABLE_NAME

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

S_1                            T

SQL> select object_id, object_name, object_type, edition_name

2  from user_objects

3  where object_name = 'S_1';

OBJECT_ID OBJECT_NAME                    OBJECT_TYPE         EDITION_NAME

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

74125 S_1                            SYNONYM             ORA$BASE

SQL> select sys_context('USERENV', 'CURRENT_EDITION_NAME')

2  from dual;

SYS_CONTEXT('USERENV','CURRENT_EDITION_NAME')

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

ORA$BASE

下面设置版本为MY_EDITION:

SQL> alter session set edition = my_edition;

会话已更改。

SQL> select synonym_name, table_name

2  from user_synonyms;

SYNONYM_NAME                   TABLE_NAME

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

S_1                            T1

SQL> select object_id, object_name, object_type, edition_name

2  from user_objects

3  where object_name = 'S_1';

OBJECT_ID OBJECT_NAME                    OBJECT_TYPE         EDITION_NAME

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

74128 S_1                            SYNONYM             MY_EDITION

可以看到在USER_SYNONYMS视图中可以只能看到当前版本的同义词定义。而在USER_OBJECTS中可以看到,两个同义词的名称相同,但是两个对象的版本名称不同,而且OBJECT_ID并不相同,也就是说,二者实际上不是同一个对象。

SQL> select obj#, owner#, name, type#

2  from sys.obj$

3  where name = 'S_1';

OBJ#     OWNER# NAME                                TYPE#

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

74125         84 S_1                                     5

74128         86 S_1                                     5

检查SYS.OBJ$发现,两个对象不但OBJECT_ID不同,连OWNER也是不同的。

SQL> select user#, name, type#, ext_username

2  from sys.user$

3  where user# in (84, 86);

USER# NAME                                TYPE# EXT_USERNAME

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

84 YANGTK                                  1

86 SYS_LNLQ7CWEC5SUF_0IC_Q_ONI8GO          2 YANGTK

当切换到不同的版本时,Oracle实际上切换到了不同的用户。

而用户查询的是当前版本的对象,这时由于很多的静态数据字典都发生了变化:

SQL> select text

2  from dba_views

3  where view_name = 'DBA_SYNONYMS';

TEXT

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

select u.name, o.name, s.owner, s.name, s.node

from sys.user$ u, sys.syn$ s, sys."_CURRENT_EDITION_OBJ" o

where o.obj# = s.obj#

and o.type# = 5

and o.owner# = u.user#

可以看到,这些支持版本对象的数据字典信息,访问的系统表不再是SYS.OBJ$,而是另外一个对象:SYS._CURRENT_EDITION_OBJ。

SQL> select owner, object_name, object_id, object_type

2  from dba_objects

3  where object_name = '_CURRENT_EDITION_OBJ';

OWNER                          OBJECT_NAME                     OBJECT_ID OBJECT_TYPE

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

SYS                            _CURRENT_EDITION_OBJ                 3070 VIEW

这个对象是一个视图,查看视图的定义:

SQL> select text

2  from dba_views

3  where view_name = '_CURRENT_EDITION_OBJ';

TEXT

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

select o."OBJ#",o."DATAOBJ#",o."OWNER#",o."NAME",o."NAMESPACE",o."SUBNAME",o."TY

PE#",o."CTIME",o."MTIME",o."STIME",o."STATUS",o."REMOTEOWNER",o."LINKNAME",o."FL

AGS",o."OID$",o."SPARE1",o."SPARE2",o."SPARE3",o."SPARE4",o."SPARE5",o."SPARE6",

o.spare3,

case when (o.type# not in (4,5,7,8,9,10,11,12,13,14,22,87) or

bitand(u.spare1, 16) = 0) then

null

when (u.type# = 2) then

(select eo.name from obj$ eo where eo.obj# = u.spare2)

else

'ORA$BASE'

end

from obj$ o, user$ u

where o.owner# = u.user#

and (   /* non-versionable object */

(   o.type# not in (4,5,7,8,9,10,11,12,13,14,22,87,88)

or bitand(u.spare1, 16) = 0)

/* versionable object visible in current edition */

or (    o.type# in (4,5,7,8,9,10,11,12,13,14,22,87)

and (   (u.type# <> 2 and

sys_context('userenv', 'current_edition_name') = 'ORA$BASE')

or (u.type# = 2 and

u.spare2 = sys_context('userenv', 'current_edition_id'))

or exists (select 1 from obj$ o2, user$ u2

where o2.type# = 88

and o2.dataobj# = o.obj#

and o2.owner# = u2.user#

and u2.type#  = 2

and u2.spare2 =

sys_context('userenv', 'current_edition_id'))

)

)

)

ORACLE就是通过将这个视图代替了数据字典中的OBJ$对象,从而使得用户可以查询当前的版本信息。

oracle 11g r2版本号,Oracle 11g r2新增版本功能(二)相关推荐

  1. oracle客户端查看版本号,Oracle 版本查看及版本号说明

    select * from v$version; 结果如下: BANNER 1 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ...

  2. Oracle会计核算版本号,ORACLE ERP 成本核算会计信息归纳

    按照事务处理的来源类型归纳. 一. 采购接收入库和退货: 1.接收: 借:材料采购 or 采购在途材料 (订单价格) 贷:应计负债/暂估 (订单价格) 2.入库: 借:原材料 (标准成本) 贷:材料采 ...

  3. oracle备份还原到本地_Oracle 11g R2 RAC数据库备份通过RMAN恢复到单实例数据库实现...

    Oracle 11g R2 RAC数据库备份通过RMAN恢复到单实例数据库实现 下面是我的一次从Oracle 11g R2 RAC到单实例间通过RMAN恢复备份集的过程,记录在此. 有些人以此方法作为 ...

  4. [转帖]Oracle 11G RAC For Windows 2008 R2部署手册

    Oracle 11G RAC For Windows 2008 R2部署手册(亲测,成功实施多次) https://www.cnblogs.com/yhfssp/p/7821593.html 总体规划 ...

  5. oracle客户端ora 12541,Oracle 11g 64bit下程序报ORA-12541: TNS: 无监听程序解决办法

    开发环境: OS:windows 2008 R2 64bit Oracle: 11g R2 64bit Oracle Client: ODTwithODAC112021 (32 bit ) IDE : ...

  6. oracle无法删除em,Oracle 11g EM删除重建的方法

    虚拟机里的Oracle 11g好长时间没用了,突然打开之后发现EM无法访问了,EM可以重建,于是也不打算查找原因了,直接使大招 OS:Windows Server 2012 Oracle:11g R2 ...

  7. oracle安装清单过不去,oracle 11g(二)安装过程

    (一)解压oracle 11g压缩包 注:分别下载oracle 11g的1of2.2of2这两个zip压缩包,将其拷贝到/usr/src目录中解压. [root@server src]#unzip l ...

  8. oracle 函数参数类型,ORACLE 11g中的表值函数? (参数化视图)

    搜索热词 过去我已经看过关于这个问题的讨论,比如 here.但是我想知道如果某个地方沿线,或许10g或11g(我们正在使用11g),ORACLE已经对"参数化视图"提供了更好的支持 ...

  9. oracle 11查询sid,oracle 11g 更改sid和dbname

    分两个阶段描述,第一阶段改sid,第二阶段改dbname 下面描述详细步骤 首先要更改sid 1.登录数据库查看先前的sid,总共三步 [oracle@localhost ~]$ sqlplus &q ...

最新文章

  1. python对文件的操作_python的 随手记----对文件的操作
  2. HashMap实现原理
  3. Key Components and Internals of Spring Boot Framework--转
  4. 哪些人不适合去做科研(转)
  5. DICOM:通讯模型
  6. 消息队列背后的设计思想
  7. vi中如何实现批量替换
  8. [转载] Python中TFTP的理解
  9. myftpadmin+proftpd+mysql架设ftp服务器_linux下用Proftpd搭建ftp服务器及配置方法
  10. 运行js提示库没有注册错误8002801d的解决办法
  11. javascript 使用canvas绘画
  12. XINS 3.1.0 Alpha2 发布,远程 API 调用规范
  13. 基于时间片的高优先级调度_CFS调度器(1)-基本原理
  14. python对文件进行zip和rar格式的压缩和解压缩(亲测,可用)
  15. PHP架构师必备技术视频合集
  16. 使用uib-tab时,获取页面输入框内容
  17. 相机等效焦距和视场角计算
  18. node.js之async的使用(series,whilst)
  19. hive中的date函数
  20. 高通SDX12:SFE(shortcut-fe)软加速驱动效果调测

热门文章

  1. android 获取apk资源,android-apk-parser
  2. java上传视频到七牛云_Java进阶学习:将文件上传到七牛云中
  3. HDL的综合和c语言的编译区别,C语言与verilog 的区别及相互转化
  4. php imagecreatefromjpeg图片太大_PHP图像处理技术及应用
  5. iphone怎样关闭副屏_小米新设计专利曝光:“Z”型折叠屏手机
  6. Windows下Qt Creator设置IDE菜单字体样式
  7. java版spring cloud+spring boot 社交电子商务平台:服务消费(基础)
  8. Spring properties定义bean
  9. WEB前端面试题汇总整理01
  10. haproxy+keepalived实现负载均衡及高可用