程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle 獲取對象的定義

Oracle 獲取對象的定義

編輯: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了。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved