我有一个“坏毛病”,对于任何问题,自己不明白的东西,总想去探个究竟,有点强迫症的感觉。对于平时工作中,遇到的Oracle中的表、序列等对象,一定要看看它们是如何定义的,要不用它们都用的不放心。不知道各位是不是这样的,如果在开发中遇到了一个封装好的类,是不是总想去看看它是如何实现的呢?反正我是这样的,好纠结。
我们这里有一个功能,需要多个小组之间合作开发完成,我的工作是给出表的定义以及在Oracle数据库中定义好对应的表。完成以后,我就去忙别的了。几天后,那边开发接口的哥们找我看一下表的字段定义,顿时就蒙住了,在SQLPLUS中怎么查看表的定义啊,对于程序员来说,在同行面前丢人是最丢人的。还好,我直接就把MySQL中的命令拿过来就用:
desc tb_xxxx;
还好,有效果,虚惊一场,差点就丢人了。为了防止以后再次出现这种情况,下班回到家,决定好好的学习一下如何查看Oracle中各种对象的定义语句。于是,总结成文,分享出来。
当我们以某个用户的身份登录Oracle以后,第一感觉就是知道这个用户拥有哪些对象,哪些权限,是个啥角色,能对数据库干点啥操作。而这篇文章主要总结的是对象,所以就从对象入手总结与分析。
在Oracle中可以定义以下几种常用对象:
等等……
上面列出了几种常用的对象,还有一些其它少用的对象(至少我很少接触)。既然有了这么多的常用对象,那我如何查看当前用户有哪些对象呢?
select object_name, object_type from dba_objects where owner=upper('user_name');
使用上述语句就可以搞定(上面的语句为什么要用upper函数???你明白吗?)。对于这些经常打交道的对象,我们经常要查看它们的定义语句,接下来就说说如何查看这些对象的定义语句。
在Oracle中,使用DBMS_METADATA
包中的GET_DDL
函数来获得对应对象的定义语句。GET_DDL
函数的定义如下:
DBMS_METADATA.GET_DDL (
object_type IN VARCHAR2,
name IN VARCHAR2,
schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform IN VARCHAR2 DEFAULT 'DDL')
RETURN CLOB;
对于每个参数的含义说明如下:
我想你也明白了,其实定义这些对象的语句都存放在数据字典里,我们只是使用DBMS_METADATA.GET_DDL
函数从数据字典里把这些对象的定义取出来。函数的声明也说完了,接下来就具体的看看如何使用这个GET_DDL
函数。
现在登录测试数据库,第一件事就是查看当前用户有哪些对象:
select * from user_objects;
然后查看这个当前登录用户下有哪些表,语句如下:
select * from user_tables;
有一张tb_student
表,先来看看这张表的定义语句,语句如下:
select dbms_metadata.get_ddl('TABLE', 'TB_STUDENT', 'JELLY') from dual;
看完了表,我们看看这张表中有哪些索引,语句如下:
select t.index_name, t.index_type, t.table_name FROM user_indexes t where t.table_name='TB_STUDENT';
看到一个名为STUDENTID_INDEX
的索引,我们看看这个索引的定义,语句如下:
select dbms_metadata.get_ddl('INDEX','STUDENTID_INDEX', 'JELLY') FROM dual;
看完了索引,我们再看看这张表上有哪些视图,语句如下:
select * from user_views;
看到一个名为V_TB_STUDENT
的索引,查看一下这个索引的定义:
select dbms_metadata.get_ddl('VIEW','V_TB_STUDENT', 'JELLY') from dual;
我们再看看该用户定义了哪些序列,语句如下:
select * from user_sequences;
有一个TEST_SEQ
的序列,看看它的定义吧。
select dbms_metadata.get_ddl('SEQUENCE', 'TEST_SEQ', 'JELLY') from dual;
悲剧,当前用户没有包对象,如果有的话,我们可以使用以下语句查看包的定义:
select dbms_metadata.get_ddl('PACKAGE',u.object_name) from user_objects u where object_type='PACKAGE';
查看存储过程的定义语句如下:
select dbms_metadata.get_ddl('PROCEDURE',u.object_name) from user_objects u where object_type='PROCEDURE';
对了,还有存储器:
select dbms_metadata.get_ddl('TRIGGER',u.object_name) from user_objects u where object_type='TRIGGER';
最后,表、索引等数据都存放在表空间中,那么当前数据库有几个表空间呢?
select * from user_tablespaces;
上述代码就可以搞定。
这篇文章主要总结了如何获得Oracle中对象的定义,具体到代码,主要是使用DBMS_METADATA.GET_DDL
函数,涉及到的表主要是两类视图:
而有的时候,我们以DBA的身份登录数据库,想查看每个用户所拥有的对象的信息,而这个时候,我们就需要用到dba_objects
视图了,然后指定OWNER过滤条件,就OK了。
2015年7月9日 于包头。