Oracle数据字典的应用实例


Oracle数据库字典介绍
Oracle数据字典是有表和视图组成的,存储有关数据库结构信息的一些数据库对象。数据库字典描述了实际数据是如何组织的。对它们可以象处理其他数据库表或视图一样进行查询,但不能进行任何修改。
Oracle数据库字典通常是在创建和安装数据库时被创建的,Oracle数据字典是Oracle数据库系统工作的基础,没有数据字典的支持,Oracle数据库系统就不能进行任何工作。
在Oracle数据库字典中,许多视图都有三个不同的实例,它们的前缀分别为"USER_"、"ALL_"及"DBA_"。"USER_"为前缀的数据库字典视图通常记录执行查询的帐户所拥有的对象的信息,"ALL_"为前缀的数据库字典视图通常记录包括执行查询的帐户所拥有的对象的信息及授权至PUBLIC的帐户用户所拥有的对象的信息,"DBA_"为前缀的数据库字典视图则包含所有数据库对象的信息,而不管其所有者。其他的字典视图中主要的是V$视图,之所以这样叫是因为他们都是以V$或GV$开头的。V$视图是基于X$虚拟视图的。V$视图是SYS用户所拥有的,在缺省状况下,只有SYS用户和拥有DBA系统权限的用户可以看到所有的视图,没有DBA权限的用户可以看到USER_和ALL_视图,但不能看到DBA_视图。与DBA_,ALL,和USER_视图中面向数据库信息相反,这些视图可视的给出了面向实例的信息。
在Oracle的绝大多数数据字典视图中都有象DBA_TABLES,ALL_TABLES和USER_TABLES这样的视图家族。Oracle中有超过100个视图家族,下表列出了最重要和最常用的视图家族,需要注意的是每个视图家族都有一个DBA_,一个ALL_一个USER_视图。

视图家族

描述

COL_PRIVS

包含了表的列权限,包括授予者、被授予者和权限

EXTENTS

数据范围信息,比如数据文件,数据段名(segment_name)和大小

INDEXES

索引信息,比如类型、唯一性和被涉及的表

IND_COLUMNS

索引列信息,比如索引上的列的排序方式

OBJECTS

对象信息,比如状态和DDL time

ROLE_PRIVS

角色权限,比如GRANT和ADMIN选项

SEGMENTS

表和索引的数据段信息,比如tablespace和storage

SEQUECNCES

序列信息,比如序列的cache、cycle和ast_number

SOURCE

除触发器之外的所有内置过程、函数、包的源代码

SYNONYMS

别名信息,比如引用的对象和数据库链接db_link

SYS_PRIVS

系统权限,比如grantee、privilege、admin选项

TAB_COLUMNS

表和视图的列信息,包括列的数据类型

TAB_PRIVS

表权限,比如授予者、被授予者和权限

TABLES

表信息,比如表空间(tablespace),存储参数(storage parms)和数据行的数量

TRIGGERS

触发器信息,比如类型、事件、触发体(trigger body)

USERS

用户信息,比如临时的和缺省的表空间

VIEWS

视图信息,包括视图定义

在Oracle中还有一些不常用的数据字典表,但这些表不是真正的字典家族,他们都是一些重要的单一的视图。这些视图见下表:

视图名称

描述

USER_COL_PRIVS_MADE

用户授予他人的列权限

USER_COL_PRIVS_RECD

用户获得的列权限

USER_TAB_PRIVS_MADE

用户授予他人的表权限

USER_TAB_PRIVS_RECD

用户获得的表权限

Oracle数据库字典的应用
借助Oracle数据字典,利用Oracle的DDL语句,我们可以做很多事情,几乎所有的Oracle开发辅助工具都是利用这一点进行设计的。作者将通过如何取得数据库表字段信息来说明。
首先我们定义一个数据库表,数据库表结构如下:

数据库表名[TABLE_TEST]

字段名

数据类型

长度

缺省值

允许空

主键

注释

NAME

VARCHAR2

40

N

Y

姓名

SEX

VARCHAR2

1

'Y'

N

性别

BIRTHDAY

DATE

0

Y

生日

HEIGHT

NUMBER

3,1

Y

身高

WEIGHT

NUMBER

3,1

Y

体重

MEMO

BLOB

0

Y

备注

创建表的SQL语句如下
-- 创建数据表
create table TABLE_TEST
(
NAME varchar2(40) not null,
SEX varchar2(1) default 'Y' not null,
BIRTHDAY date not null,
HEIGHT number(3,2),
WEIGHT number(3,2),
MEMO blob
);
-- 给列添加备注
comment on column TABLE_TEST.NAME is '姓名';
comment on column TABLE_TEST.SEX is '性别';
comment on column TABLE_TEST.BIRTHDAY is '生日';
comment on column TABLE_TEST.HEIGHT is '身高';
comment on column TABLE_TEST.WEIGHT is '体重';
comment on column TABLE_TEST.MEMO is '备注';
-- 创建约束关系 主键 外键 其他
alter table TABLE_TEST add constraint TB_TEST_P_NAME primary key (NAME);

数据表创建完毕,执行下列SQL语句:
select
A.column_name 字段名,A.data_type 数据类型,A.data_length 长度,A.data_precision 整数位,
A.Data_Scale 小数位,A.nullable 允许空值,A.Data_default 缺省值,B.comments 备注
from
user_tab_columns A,user_col_comments B
where
A.Table_Name = B.Table_Name
and A.Column_Name = B.Column_Name
and A.Table_Name = 'TABLE_TEST'

我们可以得出一下结果:

字段名

数据类型

长度

整数位

小数位

允许空值

缺省值

备注

NAME

VARCHAR2

40

N

  1<long>   
  2  
  3姓名   
  4  
  5SEX   
  6  
  7VARCHAR2   
  8  
  91   
 10  
 11  
 12  
 13  
 14  
 15N   
 16  
 17<long>   
 18  
 19性别   
 20  
 21BIRTHDAY   
 22  
 23DATE   
 24  
 257   
 26  
 27  
 28  
 29  
 30  
 31N   
 32  
 33<long>   
 34  
 35生日   
 36  
 37HEIGHT   
 38  
 39NUMBER   
 40  
 4122   
 42  
 433   
 44  
 452   
 46  
 47Y   
 48  
 49<long>   
 50  
 51身高   
 52  
 53WEIGHT   
 54  
 55NUMBER   
 56  
 5722   
 58  
 593   
 60  
 612   
 62  
 63Y   
 64  
 65<long>   
 66  
 67体重   
 68  
 69MEMO   
 70  
 71BLOB   
 72  
 734000   
 74  
 75  
 76  
 77  
 78  
 79Y   
 80  
 81<long>   
 82  
 83备注   
 84  
 85这样,我们在进行程序设计时,通过一条简单的SQL语句,然好通过Ole调用Word,便可为最终用户导出完整的数据库表字典文档。   
 86再执行下列SQL语句:   
 87select   
 88INDEX_NAME 索引名,INDEX_TYPE 索引类型,UNIQUENESS 索引类别   
 89from   
 90user_indexes   
 91where   
 92TABLE_NAME = 'TABLE_TEST'   
 93  
 94得到结果如下(注:SYS_IL0000031226C00006$$索引为系统在创建数据库表时自动创建的,用于数据库表内容的维护):   
 95  
 96  
 97  
 98索引名   
 99  
100索引类型   
101  
102索引类别   
103  
1041   
105  
106SYS_IL0000031226C00006$$   
107  
108LOB   
109  
110UNIQUE   
111  
1122   
113  
114TB_TEST_P_NAME   
115  
116NORMAL   
117  
118UNIQUE   
119  
120  
121  
122执行下列SQL语句,我们将得到更多的关于数据库表结构的信息:   
123select   
124A.column_name 字段名,A.data_type 数据类型,A.data_length 长度,A.data_precision 整数位,   
125A.Data_Scale 小数位,A.nullable 允许空值,A.Data_default 缺省值,B.comments 备注,   
126C.IndexCount 索引次数   
127from   
128user_tab_columns A,   
129user_col_comments B,   
130(select count(*) IndexCount,Column_Name from User_Ind_Columns where Table_Name = 'TABLE_TEST' group by Column_Name) C   
131where   
132A.Table_Name = B.Table_Name   
133and A.Column_Name = B.Column_Name   
134and A.Column_Name = C.Column_Name(+)   
135and A.Table_Name = 'TABLE_TEST'   
136得到结果如下:   
137  
138字段名   
139  
140数据类型   
141  
142长度   
143  
144整数位   
145  
146小数位   
147  
148允许空值   
149  
150缺省值   
151  
152备注   
153  
154索引次数   
155  
156BIRTHDAY   
157  
158DATE   
159  
1607   
161  
162  
163  
164  
165  
166N   
167  
168<long>   
169  
170生日   
171  
172  
173  
174HEIGHT   
175  
176NUMBER   
177  
17822   
179  
1803   
181  
1822   
183  
184Y   
185  
186<long>   
187  
188身高   
189  
190  
191  
192MEMO   
193  
194BLOB   
195  
1964000   
197  
198  
199  
200  
201  
202Y   
203  
204<long>   
205  
206备注   
207  
208  
209  
210NAME   
211  
212VARCHAR2   
213  
21440   
215  
216  
217  
218  
219  
220N   
221  
222<long>   
223  
224姓名   
225  
2261   
227  
228SEX   
229  
230VARCHAR2   
231  
2321   
233  
234  
235  
236  
237  
238N   
239  
240<long>   
241  
242性别   
243  
244  
245  
246WEIGHT   
247  
248NUMBER   
249  
25022   
251  
2523   
253  
2542   
255  
256Y   
257  
258<long>   
259  
260体重   
261  
262  
263  
264  
265  
266当然Oracle数据字典的应用远不止这些,通过Oracle数据库字典的支持,我们可以得到Oracle数据库结构的所有信息,著名的数据库开发工具PL/SQL Developer完全就是基于Oracle的数据库字典实现的。作者也编写了一个自己的数据库设计工具,在Oracle数据库字典的基础上进行了一些扩充,如果感兴趣可以发邮件到[email protected]同作者联系。   
267  
268[注:作者上传好几次都上传不成功,不知道原来的是否还在]</long></long></long></long></long></long></long></long></long></long></long></long>
Published At
Categories with 数据库类
Tagged with
comments powered by Disqus