2012-08-27 27 views
0

我有兩列(CAGE,HCC)允許的表。我想在我的程序中顯示重複記錄,我這樣寫。刪除列值可能爲空的重複記錄

FOR REC IN (SELECT LOCATION, NIIN, INVL_DATE, CAGE, 
      HCC,SUM(CA_QTY) AS SUM_CA,SUM(COST_QTY) AS SUM_COST,COUNT(*) FROM INVENTORY 
      GROUP BY LOCATION, NIIN, INVL_DATE, 
      CAGE, HCC 
      HAVING COUNT(*)>1) 
LOOP 
    VAR_LOC_NAME := REC.LOCATION; 
    VAR_NIIN  := REC.NIIN; 
    VAR_DATE  := REC.INVL_DATE; 
    VAR_CAGE  := REC.CAGE; 
    VAR_HCC   := REC.HCC; 
    VAR_CA_QTY  := REC.SUM_CA; 
    VAR_COST_QTY := REC.SUM_COST; 

FOR REC1 IN (SELECT SNO FROM INVENTORY WHERE LOCATION=VAR_LOC_NAME AND 
       NIIN=VAR_NIIN AND TUNC(INVL_DATE)=TRUNC(TO_DATE(VAR_DATE,'DD-MM-YY')) AND 
       CAGE=VAR_CAGE AND HCC=VAR_HCC) 
    LOOP 
     DBMS_OUTPUT.PUT_LINE('GET NUMBER '||REC1.SNO); 
    END LOOP; 
    end loop; 

但是對於CAGE和HCC的空值它不起作用。 FYI:我使用Oracle 11g

+0

是否有任何值可以使用,而不是NULL(我的意思是一些值,沒有行包含在'CAGE'或'HCC')? –

回答

0

你需要找到一些價值,未在CAGEHCC列使用,並使用Oracle的NVL功能這種獨特的值替換NULL值。所以:

FOR REC IN (SELECT LOCATION, NIIN, INVL_DATE, NVL(CAGE,-1) as CAGE, 
      NVL(HCC,-1) as HCC,SUM(CA_QTY) AS SUM_CA,SUM(COST_QTY) AS SUM_COST,COUNT(*) FROM INVENTORY 
      GROUP BY LOCATION, NIIN, INVL_DATE, 
      NVL(CAGE,-1), NVL(HCC,-1) 
      HAVING COUNT(*)>1) 

當然-1只是一個例子。

至於第二個循環:

FOR REC1 IN (SELECT SNO FROM INVENTORY WHERE LOCATION=VAR_LOC_NAME AND 
      NIIN=VAR_NIIN AND TUNC(INVL_DATE)=TRUNC(TO_DATE(VAR_DATE,'DD-MM-YY')) AND 
      NVL(CAGE,-1)=VAR_CAGE AND NVL(HCC,-1)=VAR_HCC) 

在打印輸出可以用NULL替代-1回來。

+0

第二個循環如何 – mallikarjun

+0

對不起,忘記了:] –

+0

感謝幫助我。我用適當的值替換了-1。 – mallikarjun