2017-03-22 44 views
0

必须比较下面两个表之间的数据差异。我通过编写一个MINUS查询来实现这一点,但不适合当前的任务。因为很少有表格有50-60列,每次在执行前必须提及列。plsql过程比较没有任何主键列的两个表

我跟着Expert's response,没有成功实现目标。基本上我想写一个程序:

  1. 接受这两个表名作为参数。
  2. 获取CustomerList的所有列。
  3. 然后在CustomerTableStagingCustTable之间的MINUS查询仅与在步骤2中获取的列有关。
  4. 记录任何差异。

CustomerTable的

  • Custromer_Number
  • 地址
  • ORDER_NUMBER
  • 联系
  • 国家
  • Post_Code
  • 金额

StagingCustTable

  • Custromer_Number
  • 地址
  • ORDER_NUMBER
  • 联系
  • 国家
  • Post_Code
  • 金额
  • Run_Id
  • RECORD_ID
+0

Run_Id和Record_Id可以被忽略以获得差异。 – MathurS

+0

如何使用最终的“minus”查询的结果?对于“立即执行”,您将不得不选择需要事先了解结构的变量或集合。您可以使用'dbms_sql'来打开一个基于从表列构造的查询的引用游标,但是接下来需要处理这个引用游标。 (这可能与SQL \ * Plus“print”命令一样简单,但取决于您的意图)。除非你真的需要这个程序,否则krokodilko的方法会简单得多。 –

回答

1

我不会用一个程序,但查询生成最终的查询。
动态SQL的种类。
简单的例子 - 让我们说,我们对他们有以下表和数据:

CREATE TABLE CustomerTable(
Custromer_Number int, 
Address varchar2(100), 
order_Number int, 
Contact int, 
Country varchar2(10), 
Post_Code varchar2(10), 
Amount number 
); 

INSERT ALL 
INTO CustomerTable VALUES (1, 'aaa', 1, 1, 'AA', '111', 111.11) 
INTO CustomerTable VALUES (2, 'bbb', 2, 2, 'BB', '222', 222.22) 
SELECT 1 FROM dual; 

CREATE TABLE StagingCustTable 
AS SELECT t.*, 1 As run_id, 1 as record_id 
FROM CustomerTable t 
WHERE 1=0; 

INSERT ALL 
INTO StagingCustTable VALUES (1, 'aaa', 1, 1, 'AA', '111', 111.11, 1, 1) 
INTO StagingCustTable VALUES (3, 'ccc', 3, 3, 'CC', '333', 333.33, 3, 3) 
SELECT 1 FROM dual; 
commit; 

现在,当你运行这个简单的查询:

SELECT 'SELECT ' || listagg(column_name, ',') WITHIN GROUP (ORDER BY column_id) 
     || chr(10) || ' FROM ' || max(table_name) 
     || chr(10) || ' MINUS ' 
     || chr(10) || 'SELECT ' || listagg(column_name, ',') WITHIN GROUP (ORDER BY column_id) 
     || chr(10) || ' FROM StagingCustTable ' as MySql 
FROM user_tab_columns 
WHERE table_name = upper('CustomerTable'); 

,你会得到以下结果:

MYSQL                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
------------------------------------------------------------------------- 
SELECT CUSTROMER_NUMBER,ADDRESS,ORDER_NUMBER,CONTACT,COUNTRY,POST_CODE,AMOUNT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
    FROM CUSTOMERTABLE                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
MINUS                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
SELECT CUSTROMER_NUMBER,ADDRESS,ORDER_NUMBER,CONTACT,COUNTRY,POST_CODE,AMOUNT 
FROM StagingCustTable 

现在只需复制上面的查询,将其粘贴到您的SQL客户端,运行它 - 任务在几分钟内完成。

+0

其实我必须将这些代码合并到一个包中以完成一组验证。因此可以将差异写入文件或控制台的过程或函数。是的,还有上面的动态查询。 – MathurS