我的任务是比较两个不同数据库之间的表结构。如果缺少列,我必须报告缺少的列及其表。
简单减去查询不会返回。由于我是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;
答案 0 :(得分:1)
首先,开发人员IDE(PL / SQL Developer,Oracle SQL Developer)具有架构比较工具 此外,您询问的是两个数据库,但在您的代码中,您比较了同一数据库中的两个模式。确保你了解其中的差异 最后一件事,你不需要在这里使用execute immediate。这里是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.
此代码几乎与您的代码相同,因此如果它不起作用,请尝试手动比较表格或创建可重现的示例。