oracle取定义,Oracle 获取对象的定义

我有一个“坏毛病”,对于任何问题,自己不明白的东西,总想去探个究竟,有点强迫症的感觉。对于平时工作中,遇到的Oracle中的表、序列等对象,一定要看看它们是如何定义的,要不用它们都用的不放心。不知道各位是不是这样的,如果在开发中遇到了一个封装好的类,是不是总想去看看它是如何实现的呢?反正我是这样的,好纠结。

差点又丢人了

我们这里有一个功能,需要多个小组之间合作开发完成,我的工作是给出表的定义以及在Oracle数据库中定义好对应的表。完成以后,我就去忙别的了。几天后,那边开发接口的哥们找我看一下表的字段定义,顿时就蒙住了,在SQLPLUS中怎么查看表的定义啊,对于程序员来说,在同行面前丢人是最丢人的。还好,我直接就把MySQL中的命令拿过来就用:

desc tb_xxxx;

还好,有效果,虚惊一场,差点就丢人了。为了防止以后再次出现这种情况,下班回到家,决定好好的学习一下如何查看Oracle中各种对象的定义语句。于是,总结成文,分享出来。

查看用户的所有对象

当我们以某个用户的身份登录Oracle以后,第一感觉就是知道这个用户拥有哪些对象,哪些权限,是个啥角色,能对数据库干点啥操作。而这篇文章主要总结的是对象,所以就从对象入手总结与分析。

在Oracle中可以定义以下几种常用对象:

索引

视图

序列

触发器

存储过程

表空间

等等……

上面列出了几种常用的对象,还有一些其它少用的对象(至少我很少接触)。既然有了这么多的常用对象,那我如何查看当前用户有哪些对象呢?

selectobject_name,object_typefromdba_objectswhereowner=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*fromuser_objects;

然后查看这个当前登录用户下有哪些表,语句如下:

select*fromuser_tables;

有一张tb_student表,先来看看这张表的定义语句,语句如下:

selectdbms_metadata.get_ddl('TABLE','TB_STUDENT','JELLY')fromdual;

看完了表,我们看看这张表中有哪些索引,语句如下:

selectt.index_name,t.index_type,t.table_name FROM user_indexes twheret.table_name='TB_STUDENT';

看到一个名为STUDENTID_INDEX的索引,我们看看这个索引的定义,语句如下:

selectdbms_metadata.get_ddl('INDEX','STUDENTID_INDEX','JELLY')FROM dual;

看完了索引,我们再看看这张表上有哪些视图,语句如下:

select*fromuser_views;

看到一个名为V_TB_STUDENT的索引,查看一下这个索引的定义:

selectdbms_metadata.get_ddl('VIEW','V_TB_STUDENT','JELLY')fromdual;

我们再看看该用户定义了哪些序列,语句如下:

select*fromuser_sequences;

有一个TEST_SEQ的序列,看看它的定义吧。

selectdbms_metadata.get_ddl('SEQUENCE','TEST_SEQ','JELLY')fromdual;

悲剧,当前用户没有包对象,如果有的话,我们可以使用以下语句查看包的定义:

selectdbms_metadata.get_ddl('PACKAGE',u.object_name)fromuser_objects uwhereobject_type='PACKAGE';

查看存储过程的定义语句如下:

selectdbms_metadata.get_ddl('PROCEDURE',u.object_name)fromuser_objects uwhereobject_type='PROCEDURE';

对了,还有存储器:

selectdbms_metadata.get_ddl('TRIGGER',u.object_name)fromuser_objects uwhereobject_type='TRIGGER';

最后,表、索引等数据都存放在表空间中,那么当前数据库有几个表空间呢?

select*fromuser_tablespaces;

上述代码就可以搞定。

总结

这篇文章主要总结了如何获得Oracle中对象的定义,具体到代码,主要是使用DBMS_METADATA.GET_DDL函数,涉及到的表主要是两类视图:

user_objects视图

user_视图,例如:user_tables、user_views等

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值