用dbms_metadata.get_ddl獲取ddl語句
如何抽取資料表的呼叫關係?
我們在進行資料匯入匯出等操作時,如果不是按照設計文件比對,經常會出現資料完整性相
關的報錯。如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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 獲取ddl語句Oracle
- 通過DBMS_METADATA.GET_DDL包獲得相關物件ddl語句物件
- 利用dbms_metadata.get_ddl檢視DDL語句
- 獲取物件DDL語句的方法物件
- Oracle利用dbms_metadata.get_ddl檢視DDL語句Oracle
- dbms_metadata.get_ddl()來獲得物件的定義語句物件
- oracle之 獲取建表ddl語句Oracle
- DBMS_METADATA.GET_DDL獲取使用者ddl指令碼指令碼
- 使用DBMS_METADATA.GET_DDL獲取物件的DDL指令碼物件指令碼
- oracle dbms_metadata 獲取ddl語句Oracle
- oracle使用dbms_metadata.get_ddl包檢視DDL語句定義Oracle
- Oracle中獲取TABLE的DDL語句的方法Oracle
- 通過dblink獲取遠端DDL語句
- 獲取object的建立指令碼 - DBMS_METADATA.GET_DDLObject指令碼
- 利用dbms_metadata.get_ddl生成對應定義語句
- 使用dbms_metadata.get_ddl檢視物件的定義語句。物件
- 搬運工,oracle獲得ddl語句Oracle
- 如何獲取expdp出來的dmp檔案中的DDL語句
- DBMS_METADATA包獲得物件DDL語句物件
- dbms_metadata.get_ddl
- PL/SQL與DDL語句SQL
- 獲取物件的構建語句物件
- oracle獲取ddl指令碼Oracle指令碼
- 獲取建tablespace sql ddlSQL
- dbms_metadata.get_ddl的妙用
- dbms_metadata.get_ddl學習
- dbms_metadata.get_ddl的使用
- 關於dbms_metadata.get_ddl
- dbms_metadata.get_ddl的用法
- Laravel 獲取執行的sql語句LaravelSQL
- 觸發器中獲取SQL語句觸發器SQL
- dbms_metadata.get_ddl詳細用法
- PostgreSQL 函式獲取表DDLSQL函式
- Mysql 獲取表設計查詢語句MySql
- DBMS_METADATE.GET_DDL獲取物件DDL指令碼物件指令碼
- PostgreSQL獲取建表語句儲存過程SQL儲存過程
- 6.3. 基本SQL語句——6.3.1. DDLSQL
- 使用資料泵匯出DDL語句