果冻想
认真玩技术的地方

Oracle学习笔记——获取对象的定义

我有一个“坏毛病”

我有一个“坏毛病”,对于任何问题,自己不明白的东西,总想去探个究竟,有点强迫症的感觉。对于平时工作中,遇到的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;

对于每个参数的含义说明如下:

  • OBJECT_TYPE ---对象类型
  • NAME ---对象名称
  • SCHEMA ---对象所在的Schema,默认为当前用户所在所Schema(不懂的看这里!)
  • VERSION ---对象原数据的版本
  • MODEL ---原数据的类型默认为ORACLE
  • TRANSFORM ---(搞不懂是干啥的,没用过)
  • RETURNS: 对象的原数据默认以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函数,涉及到的表主要是两类视图:

  • user_objects视图
  • user_<具体的对象>视图,例如:user_tables、user_views等

而有的时候,我们以DBA的身份登录数据库,想查看每个用户所拥有的对象的信息,而这个时候,我们就需要用到dba_objects视图了,然后指定OWNER过滤条件,就OK了。

果冻想,认真玩技术的地方。

2015年7月9日 于包头。

未经允许不得转载:果冻想 » Oracle学习笔记——获取对象的定义
网站维护离不开您的支持,您可以赞助本站,谢谢支持
×

感谢您的支持,我们会一直保持!

扫码支持
请土豪扫码随意打赏

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

赞助本站
关注微信公众号
关注微信公众号和果冻一起分享你的疑惑与心得。
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

玩技术,我们是认真的

联系我们关于果冻