2016-12-07 133 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例子。