2016-12-07 2 views
0

У меня есть задача сравнить структуру таблиц между двумя различными базами данных. Если отсутствует столбец, я должен сообщить о недостающем столбце и его таблицах.plsql сравнение структуры таблиц в 2 разных базе данных

Простой минус запрос не возвращается. Поскольку я очень новичок в программировании pl sql, у меня нет идей.

Может кто-нибудь, пожалуйста, помогите мне с этим?

Table 1: 
Columns 
ABC 
DEF 
GHI 

Table2: 
ABC 
DEF 
GHI 
JKL 

Дополнительная колонка. Если это нужно сообщить, как мне это сделать.

PFB мой простой прок:

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

Прежде всего, разработчик Иды (PL/SQL Developer, 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 пример.

Смежные вопросы