菜鳥學sql,Oracle數據庫結構比較

轉載自:http://www.cnblogs.com/tianqing/archive/2008/06/25/1229419.htmlhtml

作oracle下數據庫結構比較,比較具體詳細差別,例如:2個庫具體有那些表不一樣,不一樣在什麼地方,主鍵、長度、類型......,要求是用一句sql實現,對於我這個sql菜鳥來講,的確是個挑戰。好在有個SQL Server例子能夠借鑑。先貼一下oracle下的sqlsql

--------------------------------------------------------------------------------------
--oracle數據庫賬套比較,
--在本例中,databaseA數據庫,
          --databaseB是數據庫。
--在實際的運行過程當中,請依據須要修改本sql
--------------------------------------------------------------------------------------
select (case when a.表名1 is null and b.序號=1 then '庫1缺乏表:'||b.表名2
                     when b.表名2 is null and a.序號=1 then '庫2缺乏表:'||a.表名1
                     when a.字段名 is null and exists(select 1 from (select table_name as 表名1  from DBA_TAB_COLUMNS where upper(DBA_TAB_COLUMNS.owner) =upper('databaseB')) where 表名1=b.表名2) then '庫1 ['||b.表名2||'] 缺乏字段:'||b.字段名
                     when b.字段名 is null and exists(select 1 from (select table_name as 表名2  from DBA_TAB_COLUMNS where upper(DBA_TAB_COLUMNS.owner) =upper('databaseA')) where 表名2=a.表名1) then '庫2 ['||a.表名1||'] 缺乏字段:'||a.字段名
                     when a.主鍵<>b.主鍵 then '主鍵不一樣'
                     when a.類型<>b.類型 then '類型不一樣'
                     when a.字段長度<>b.字段長度 then '字段長度不一樣'
                     when a.精度<>b.精度 then '精度不一樣'                    
                     when a.小數位<>b.小數位 then '小數位不一樣'
                     when a.容許空<>b.容許空 then '容許空不一樣'
                else '' end) result,a.*,b.*      
from (select a.table_name as 表名1, a.column_name as 字段名,b.constraint_type as 主鍵, a.data_type as 類型,column_id as 序號, a.data_length as 字段長度, a.data_precision as 精度,  a.data_scale as 小數位, a.nullable as 容許空   
   from all_tab_columns a left join (select d.constraint_type,e.column_name,e.table_name from all_constraints d,all_cons_columns e
 where  d.owner  =  e.owner  and d.table_name  =  e.table_name and
  d.constraint_name  =  e.constraint_name and d.constraint_type  = 'P') b on a.COLUMN_NAME = b.column_name and a.TABLE_NAME = b.table_name
   where  a.owner  = upper('databaseB') order by 表名1 asc) a

full join (select a.table_name as 表名2, a.column_name as 字段名,b.constraint_type as 主鍵, a.data_type as 類型,column_id as 序號, a.data_length as 字段長度, a.data_precision as 精度,  a.data_scale as 小數位, a.nullable as 容許空   
   from all_tab_columns a left join (select d.constraint_type,e.column_name,e.table_name from all_constraints d,all_cons_columns e
 where  d.owner  =  e.owner  and d.table_name  =  e.table_name and
  d.constraint_name  =  e.constraint_name and d.constraint_type  = 'P') b on a.COLUMN_NAME = b.column_name and a.TABLE_NAME = b.table_name
   where  a.owner  = upper('databaseA') order by 表名2 asc) b
on a.表名1=b.表名2 and a.字段名=b.字段名      
where  a.表名1 is null or a.字段名 is null or b.表名2 is null or b.字段名 is null  or a.類型<>b.類型 or a.字段長度<>b.字段長度 or a.精度<>b.精度 or a.小數位<>b.小數位 or a.容許空<>b.容許空 or a.主鍵<>b.主鍵
order by nvl(a.表名1,b.表名2),nvl(a.序號,b.序號)

執行結果顯示的差別信息比較詳細。能夠依據這個來修改數據庫,比較方便。
如今分析下這句sq的語法。
1.將兩個數據庫oracle叫schema下的全部表結構select出來,即:數據庫

全部表結構
select a.table_name as 表名1, a.column_name as 字段名,b.constraint_type as 主鍵, a.data_type as 類型,column_id as 序號, a.data_length as 字段長度, a.data_precision as 精度,  a.data_scale as 小數位, a.nullable as 容許空   
  from all_tab_columns a left join (select d.constraint_type,e.column_name,e.table_name from all_constraints d,all_cons_columns e
  where  d.owner  =  e.owner  and d.table_name  =  e.table_name and
   d.constraint_name  =  e.constraint_name and d.constraint_type  = 'P') b on a.COLUMN_NAME = b.column_name and a.TABLE_NAME = b.table_name
  where  a.owner  = upper('databaseB') order by 表名1 asc

經過上述sql就能夠將某個數據庫下的表結構select出來,經過left join 關聯列的主鍵。
2. 將要比較的兩個庫的表結構用full join 關聯起來。
3. 同在用case來比較具體不一樣信息。而後在加上where條件。

綜述,比較oracle中,2個數據庫的表結構基本就用上述sql比較了,效率有些慢,朋友們有好的建議能夠談談。謝謝。oracle

相關文章
相關標籤/搜索