IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    果冻想发表于 2015-07-16 15:16:20
    love 0

    我有一个“坏毛病”

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



沪ICP备19023445号-2号
友情链接