用dbms_metadata.get_ddl獲取ddl語句

to_be_Dba發表於2012-10-30

如何抽取資料表的呼叫關係?

我們在進行資料匯入匯出等操作時,如果不是按照設計文件比對,經常會出現資料完整性相

關的報錯。如a、b表間存在外來鍵關係,a為主表。直接向b表中插入a中沒有的資料會報錯。
找到a、b表間是否存在著約束關係,就能夠有參照地進行處理了。

那麼如何得到約束的建立語句,從而找到表之間存在的依賴關係呢?

由於以前用dbms_metadata函式獲取過表的建立語句,首先想到是否可以用此函式獲取約束的

建立語句呢?

=========================================

dbms_metadata.get_ddl

以前只知道dbms_metadata的get_ddl方法可以用於獲取建表語句,因此今天想到是否可以用

其獲得其他物件的建立語句呢?
參考資料:
http://www.stanford.edu/dept/itss/docs/oracle/10g/appdev.101/b10802/d_metada.htm#

998564
http://blog.csdn.net/wh62592855/article/details/4697840

第一份參考資料中對於該函式的講解比較全面,但對於哪些物件可以用此函式獲取並未明確

,第二份參考資料則更加實際,例舉了一些常見待獲取ddl語句的物件。

我在oracle 9i環境中執行了如下語句:
select dbms_metadata.get_ddl('TABLE','EMP','SCOTT')  from dual;--獲取表的建立語句
select dbms_metadata.get_ddl('INDEX','EMP_IDX','SCOTT')  from dual;--獲取索引的創

建語句
select dbms_metadata.get_ddl('FUNCTION','GET_USER','SCOTT')  from dual;--獲取函式

的建立語句
select dbms_metadata.get_ddl('PACKAGE','PCK_DBADMIN_GETDDL','SCOTT')  from dual;

--獲取包、包體的建立語句 
select dbms_metadata.get_ddl('VIEW','EMP_DEPT_02','SCOTT')  from dual;--獲取檢視

的建立語句
select dbms_metadata.get_ddl('SEQUENCE','TEMP_SEQ','SCOTT')  from dual;--獲取序列

的建立語句
select dbms_metadata.get_ddl('MATERIALIZED_VIEW','EMP_DEPT_01','SCOTT')  from

dual;--獲取物化檢視的建立語句
select dbms_metadata.get_ddl('TRIGGER','CHECK_MGR','SCOTT')  from dual;--獲取物化

檢視的建立語句
select constraint_name,dbms_metadata.get_ddl('CONSTRAINT',constraint_name,owner)

from user_constraints where constraint_type not in('R','O','C');
select constraint_name,dbms_metadata.get_ddl('CONSTRAINT',constraint_name,owner)

from user_constraints where constraint_type ='R';--獲取參照性約束的建立語句,報錯
select constraint_name,dbms_metadata.get_ddl('CONSTRAINT',constraint_name,owner)

from user_constraints where constraint_type ='F';--實驗環境中沒有結果
select constraint_name,dbms_metadata.get_ddl('CONSTRAINT',constraint_name,owner)

from user_constraints where constraint_type ='O';--實驗環境中沒有結果
select constraint_name,dbms_metadata.get_ddl('CONSTRAINT',constraint_name,owner)

from user_constraints where constraint_type ='U';--獲取唯一約束的建立語句,有結果
select dbms_metadata.get_ddl('CONSTRAINT','FK_DEPTNO','SCOTT')  from dual;--獲取

物化檢視的建立語句
select dbms_metadata.get_ddl('USER','SCOTT')  from dual;--獲取使用者的建立語句
select dbms_metadata.get_ddl('TABLESPACE','SYSTEM')  from dual;--獲取表空間的建立

語句
select dbms_metadata.get_ddl('SYNONYM','DUAL')  from dual;--獲取同義詞的建立語句
select dbms_metadata.get_ddl('','DUAL')  from dual;--獲取同義詞的建立語句

 

此函式可以進行處理的物件包括:

物化檢視
索引
函式
包、包體
觸發器
序列
同義詞
等等

不能處理的物件包括dblinks、外來鍵約束等

需要注意的是:
(1)產生的語句中,物件名稱是用雙引號包含的
(2)語句中的空格數是和原始資料不一樣的(具體原因無法理解,但直接呼叫可能會有問題


(3)語句中的object_type項必須嚴格大寫,且不能有拼寫錯誤
(4)約束的獲取比較特殊,後面詳述
(5)通過資料字典可以更加方便地獲得ddl語句
(如:獲得所有使用者的ddl,語句為
select username,dbms_metadata.get_ddl('USER',username) from dba_users;)


============================================================================

用這種方法並不能得到我們想要的外來鍵約束詳細內容。oracle中外來鍵的詳細內容似乎不是從

dba/user/all_constraints中得到的。然而,我們應該看到:某張表中的外來鍵列應該是另外

某張表上的主鍵。

通過外來鍵名找到約束的名稱和其參照的約束名稱(也就是主表上的主鍵名)。如果我們通過

層次查詢,就可以找到其對應關係,從而分析出哪些表需要先建立。

外來鍵的定義格式為alter table table_name add constraint constraint_name foreign

key(column_name) references tab2_name(tab2_column_name);

 

通過以下語句,可以獲得表之間的外來鍵聯絡
select level,uc.table_name||'->'||u.table_name "primary->standbys" from

user_constraints u,user_constraints uc
where u.r_constraint_name=uc.constraint_name
start with uc.table_name not in
(select table_name from user_constraints where constraint_type='R')
connect by prior u.table_name=uc.table_name
order by level

這樣,在匯入資料時就需要按照level級別,首先處理不存在外來鍵呼叫的,每次保證匯入的數

據不違反約束條件。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26451536/viewspace-747868/,如需轉載,請註明出處,否則將追究法律責任。

相關文章