Oracle專家必須頻繁地從Oracle裡提取出表格或者索引的定義,並將它們移植到不同的系統裡。從字典裡提取出用於Oracle結構描述對象(例如,表格、索引、存儲過程、觸發器、順序等等)的數據定義語言(Data Definition Language,DDL),在你將系統移植到新的平台上,以及當你想要在tablespace裡預先創建對象的時候很有用。
一般來說,在Oracle的移植裡,結構描述和DDL都是在目標數據庫裡創建的,然後使用Oracle裡帶有IGNORE=Y參數的imp工具將數據列導入到新的數據庫裡。IGNORE=Y這個參數會告訴Oracle要使新的DDL定義,而不是使用導入數據文件裡的DDL。
在Oracle9i之前,獲取表格和索引的DDL是一個既費時又麻煩的過程。你可以運行帶有ROWS=NO參數的導出工具——exp,但是其輸出卻由於每一行的引用字符串以及不佳的格式而很難重復使用。其他唯一的選擇就是編寫復雜的字典腳本(dictionary script),但是這些腳本可能無法對諸如IOT和嵌套表格這樣的復雜對象使用。
但是在Oracle9i裡,你可以使用一個叫做dbms_metadata的新的工具包,它能夠輕易地直接顯示數據字典裡的DDL和存儲過程。使用這個強大的工具,你就可以提取出獨立的對象或者整個Oracle的結構描述。最好的消息是,它很容易使用。你只用簡單地執行dbms_metadata.get_ddl,並指定對象名,Oracle就會提取出馬上能夠使用的DDL。
要提取出整個表格以及用於EMP表格的索引,就要執行dbms_metadata. get_ddl,從DUAL裡進行選擇,再提供所有必需的參數,如Listing A所示。
其輸出如Listing B所示。唯一卻失的東西就是每個陳述式之後的結束分號(;)。為了說明問題,我將演示如何使用INDEX自變量將主要關鍵字作為表格DDL的一部分提取出來,或者單獨提取出來。
要注意,你已經完成了表格和索引的定義,包括存儲參數(例如,pctfree、pctused、freelists和freelist groups),以及tablespace存儲和緩沖池指令(buffer pool directive)。
對於大范圍的遷移,你可以修改dbms_metadata句法來提取出整個結構描述。正如你可以在Listing C裡看到的,選擇dbms_metadata. get_ddl並指定USER_TABLES和USER_INDEXES就能夠輕易實現這一點。這個句法會提取出用於整個結構描述(在本例裡,就是scott結構描述)的完整表格和索引定義。