我有一個“壞毛病”,對於任何問題,自己不明白的東西,總想去探個究竟,有點強迫症的感覺。對於平時工作中,遇到的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了。