輕松取得 Oracle 結構描述句法
2024-08-29 13:37:36
供稿:網友
 
             
  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結構描述)的完整表格和索引定義。
  
  dbms_metadata工具也可以被用來提取保存在Oracle程序包里的源代碼、PL/SQL和java。使用dbms_metadata,存儲過程或者函數也能夠被輕易地提取出來。
  
  在Listing D的例子里,我提取出了所有同fred結構描述相關聯的過程。
  
  dbms_metadata工具對于提取過程碼尤其有用,因為原來所有的格式都被保留下來了。Listing E是dbms_metadata為存儲過程所做出的輸出。
  
  dbms_metadata所存在的問題
  
  同所有Oracle的新工具一樣,dbms_metadata也有一些缺點。當你有一些帶有外來要害字引用完整性(例如Oracle的references限制)的表格時,按照重新加載到另一個數據庫里的正確順序而使用dbms_metadata來提取表格DDL是非常好的。假如你沒有按照外來要害字引用完整性的正確順序來提取表格,那么就會有一個表格被添加,它會參照另一個還沒有被添加表格的表格。進行這項更改將會涉及一個WHERE子句的加入,這個子句會查詢dba_constraints和dba_cons_columns,以確定正確的表格順序。
  
  盡管有這些看得到的缺點,但是dbms_metadata工具在從Oracle里提取DDL和過程代碼上不失為一個理想的工具。Oracle未來的發行版會讓dbms_metadata更加強大,對此我深信不疑。