2017-03-17 57 views
1

我有两个表2017和2018.两个表具有相同的列,但值不同。我希望获得每列的不同值,并且我希望确保2018年的所有独特列在2017年出现。我在每张表中都有超过100列。我用光标尝试了下面的查询。其结果将被存储在一个名为“RESULT_MINUS”提前使用光标获取不同的值

DECLARE 
    COL   VARCHAR2 (200); 
    OUTRECORD VARCHAR2 (200); 

    CURSOR COLUMN_NM 
    IS 
     SELECT COLUMN_NAME 
     FROM all_tab_columns 
     WHERE  table_name = 'COMPARE_2018_P1' 


    CURSOR DIFFERENCE 
    IS 
     SELECT OUTRECORD 
     FROM (SELECT DISTINCT COL 
       FROM COMPARE_2018_P1 
       MINUS 
       SELECT DISTINCT COL 
       FROM COMPARE_2017_P1); 
BEGIN 
    OPEN COLUMN_NM; 

    LOOP 
     FETCH COLUMN_NM INTO COL; 

     DBMS_OUTPUT.put_line (COL); 

     OPEN DIFFERENCE; 

     LOOP 
     FETCH DIFFERENCE INTO OUTRECORD; 

     INSERT INTO RESULT_MINUS 
       VALUES ('B001', 
         'COMPARE', 
         '2018', 
         COL, 
         OUTRECORD, 
         'NOT PRESENT IN 2017'); 
         COMMIT; 
     END LOOP; 

     CLOSE DIFFERENCE; 
     END LOOP; 

     CLOSE COLUMN_NM; 

    END; 

感谢其他表..

+1

(1)用你正在使用的数据库标记你的问题。 (2)提供样本数据和期望的输出。 (3)提出问题。例如,你现在的代码有什么问题? –

+1

为什么你在不同的年份有不同的表格? – jarlh

+0

我正在使用oracle数据库 – mano

回答

0

为什么你会在插入不同的内循环使用游标?只要这样做:

INSERT INTO RESULT_MINUS (. . .) -- always include the columns 
    SELECT 'B001', 'COMPARE', '2018', 'COL', COL, 'NOT PRESENT IN 2017' 
    FROM (SELECT DISTINCT COL 
      FROM COMPARE_2018_P1 
      MINUS 
      SELECT DISTINCT COL 
      FROM COMPARE_2017_P1 
     ) c; 

至于循环遍历表中的列,这是一个合理的游标使用。

您的代码不起作用,因为DIFFERENCE游标需要在内部循环中定义。但它根本不需要。

+0

但我需要比较每列的不同值。所以我想用光标 – mano

+0

@mano。 。 。您可以将光标用于*列*。 *值*不需要光标。 –

+0

但是,当我通过列的差异游标不工作 – mano

0

如果要使用CURSOR逻辑,则必须动态定义DIFFERNECE游标(替换列名称)。

变化

OPEN DIFFERENCE; 

OPEN FOR 
    'SELECT OUTRECORD 
    FROM (SELECT DISTINCT ' || COL || 
      ' FROM COMPARE_2018_P1 
      MINUS 
      SELECT DISTINCT ' || COL || 
      ' FROM COMPARE_2017_P1)'; 

并取出光标的定义。

但是,当然,使用来自其他答案的动态插入的方法由于更好的性能而是可取的。