2016-12-07 302 views
0

我有一個比較兩個不同數據庫之間表的結構的任務。如果有一個列丟失,我必須報告缺失的列和表。plsql比較兩個不同數據庫中表的結構

簡單的減號查詢不會返回。由於我對pl sql編程非常陌生,因此我沒有任何想法。

有人可以幫我這個嗎?

Table 1: 
Columns 
ABC 
DEF 
GHI 

Table2: 
ABC 
DEF 
GHI 
JKL 

這是一個附加列。如果必須報告,我該怎麼做。

PFB我簡單PROC:

所有的
create or replace PROCEDURE PROC_EU_TABLE_COMPARE (
R_CURSOR OUT SYS_REFCURSOR, 
SRC_SCHEMA_NAME   IN VARCHAR2, 
TGT_SCHEMA_NAME   IN VARCHAR2 
) 

IS 


CNT3 NUMBER; 
SQL_TEXT3 VARCHAR2(4000); 

BEGIN 

--SRC_SCHEMA_NAME  := UPPER(SRC_SCHEMA_NAME); 
--TGT_SCHEMA_NAME  := UPPER(TGT_SCHEMA_NAME); 


SQL_TEXT3:='SELECT * FROM 
((SELECT * FROM ALL_TAB_COLUMNS WHERE TABLE_NAME =''%EU%'' AND OWNER ='''||SRC_SCHEMA_NAME||''' 
     MINUS 
     SELECT * FROM ALL_TAB_COLUMNS WHERE TABLE_NAME LIKE ''%EU%''AND OWNER ='''||TGT_SCHEMA_NAME||''') 
     UNION 
     (SELECT * FROM ALL_TAB_COLUMNS WHERE TABLE_NAME LIKE ''%EU%''AND OWNER ='''||TGT_SCHEMA_NAME||''' 
     MINUS 
     SELECT * FROM ALL_TAB_COLUMNS WHERE TABLE_NAME =''%EU%'' AND OWNER ='''||SRC_SCHEMA_NAME||'''))'; 

     EXECUTE IMMEDIATE SQL_TEXT3 INTO CNT3; 
     DBMS_OUTPUT.PUT_LINE(CNT3); 

END; 
+2

有很多選項沒有寫你自己的代碼。例如,SQL Developer比較模式對象。 http://www.dba-oracle.com/t_compare_schemas.htm – Rene

回答

1

首先,開發者IDE(PL/SQL開發人員,Oracle SQL Developer中)有模式比較工具。
此外,您正在詢問兩個數據庫,但在您的代碼中,您將兩個模式比較在同一個數據庫中。確保你瞭解差異。
而最後一件事,你不需要立即在這裏執行。這裏的腳本的SQL * Plus:

SQL> create table table1 (
    abc number, 
    def number, 
    ghi number); 

Table created. 

SQL> create table table2 (
    abc number, 
    def number, 
    ghi number, 
    jkl number); 

Table created. 

SQL> create or replace procedure compare_tables is 
begin 
    for i in (select column_name 
       from all_tab_columns 
      where table_name = 'TABLE2' 
      minus 
      select column_name 
       from all_tab_columns 
      where table_name = 'TABLE1') loop 
    dbms_output.put_line(i.column_name);   
    end loop; 
end; 
/

Procedure created. 

SQL> begin 
    dbms_output.put_line('Columns of table2 not presented in table1:'); 
    compare_tables; 
end; 
/

Columns of table2 not presented in table1: 
JKL 

PL/SQL procedure successfully completed. 

此代碼直逼你的,所以如果它不工作,嘗試手動比較表或創建一個reproduceble例子。