日期:2014-05-16  浏览次数:20605 次

理解Oracle数据字典
本篇文章整理自网络。
一、概述
    ORACLE数据字典是ORACLE数据库的重要组成部分,它提供了诸如数据库结构、数据库对
象空间分配和数据库用户等等有关数据库的信息。
    Oracle里数据字典按照他们存在的形式可以分为数据字典表和动态性能视图。
    1.数据字典表
    数据字典表和用户创建的表没有什么区别,不过数据字典表里的数据是Oracle系统存放的系统数据,而普通表存放的是用户的数据而已,为了方便的区别这些表,这些表的名字都是用"$"结尾,当看到的sql语句里"$"结尾的这些表,这可能是一个数据字典表。对于数据字典表,里面的数据是有数据库系统自身来维护的,所以这里虽然和普通表一样可以用DML语句来修改数据内容,但是大家最好还是不要自己来做了,因为这些表都是作用于数据库内部的。
    这里的数据字典表的用户都是sys,存在在system这个表空间里,表名都用"$"结尾,为了便于用户对数据字典表的查询,这样的名字r是不利于我们记忆的,所以Oracle对这些数据字典都分别建立了用户视图视图,不仅有叻更容易接受的名字,还隐藏了数据字典表表之间的关系,让我们字节通过视图来进行查询,简单而形象,Oracle针对这些对象的范围,分别把视图命名为DBA_XXXX, ALL_XXXX和USER_XXXX。
    DBA_XXXX 可以看到所有数据字典里的信息
    ALL_XXXX 可以看到所有这个用户可以看到的信息
    USER_XXXX 仅仅是这个用户拥有的信息。
    这些视图是由sys用户创建的,所以使用需要加上sys ,显然这个太麻烦了,所以Oracle为每个数据字典表的视图头建立了同名字的公共同义词(public synonyms). 这样简单的处理就省去了写sys.这个麻烦事。
    2.动态性能视图
    数据库的对象信息,比如表,用户,存储过程,函数,视图,索引等等,这些存在在数据库里的对象的信息,都是在数据字典表里进行维护的,我们可以借用一些比较好的Oracle开发工具比如PLSQL查看他们,或者直接通过对数据字典表进行sql查询,从而获得对象的信息。不过在数据库的meta信息里,除了这些对象静态对象的这些信息以外,数据库运行时的一些信息对于我们来说也是非常有帮助的,也更为有意义。比如,有多少个session,有什么样的process在实例里运行,系统的状态现在是如何的,可以看到这些信息都是实例运行时的动态信息,不是固定的信息,不同的时刻可能信息也是不一样的, Oracle为了进行维护的时候能够得知这些实例的这些类似状态一样的动态的信息,提供了动态性能视图,通过这个动态性能视图我们可以了解到实例内部的一些动态变化的状态信息。
    动态信息视图也是数据字典的一种,也可以在dictionary里找到,开头为v$的都是我们这里提到的动态性能视图。 如V$Session.

二、深入理解
     Oracle 的字典表和视图基本上可以分为三个层次。
1).X$表:这一部分表是 Oracle 数据库的运行基础,在数据库启动时由 Oracle 应用程序动态创建,这些对象只能查询。
2).GV$和 V$视图 :在创建了 X$表之后,Oracle 创建了 GV$和 V$视图。GV$视图的产生是为了满足 OPS 环境的需要,在 OPS 环境中,查询 GV$视图返回所有实例信息,而每个
V$视图是基于 GV$视图,增加了 INST_ID列的 WHERE 条件限制建立,只包含当前连接实例信息。
3).GV_$,V_$视图和 V$,GV$同义词 :在 GV$和 V$之后,Oracle 建立了 GV_$和 V_$视图,随后为这些视图建立了公用同义词。通常我们大部分用户访问的 V$对象,并不是视图,而是指向 V_$视图的同义词;而 V_$视图是基于真正的 V$视图(这个视图是基于 X$表建立的)。
详细的Oracle启动过程中创建这些表及视图,同义词的过程可参考链接:http://www.itpub.net/thread-199099-1-1.html。研究Oracle的数据字典,数据库对象之间的关系,以下是比较重要的:v$fixed_table,v$fixed_view_definition,bootstrap$。

三、简单应用(本人未验证)
利用数据字典功能,实现表中列的重命名。当然也可以使用简单的ddl语言来进行,如ALTER   TABLE   table_name   RENAME   COLUMN   old_col   TO   new_col;以下为实现的代码
create or replace procedure sys.altercolname 
(schmaname in varchar2, 
tabname in varchar2, 
oldcolname in varchar2, 
newcolname in varchar2) is 
n_schmaname varchar2(30); --模式名称 
n_tablename varchar2(30); --表名称 
n_oldcolname varchar2(30); --原来列名称 
n_newcolname varchar2(30); --新的列名称 
n_objnum number; 
begin 
  n_schmaname := upper(schmaname); 
  n_tablename := upper(tabname); 
  n_oldcolname := upper(oldcolname); 
  n_newcolname := upper(newcolname); 
  SELECT OBJECT_ID INTO n_objnum 
  FROM ALL_OBJECTS 
  WHERE OWNER = n_schmaname 
  AND OBJECT_NAME=n_tablename; 

  UPDATE SYS.COL$ 
  SET NAME=n_newcolname 
  WHERE OBJ# = n_objnum AND 
  NAME=n_oldcolname; 
  COMMIT; 
  end altercolname; 

调用方式(不同环境下可能稍有不同):
exec altercolname(‘模式名称’,‘表名称’,‘原列名称’,‘新列名称’);