0

2つの列(CAGE、HCC)のnullが許可されているテーブルがあります。プロシージャに重複するレコードを表示したいので、このように記述しました。

 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のヌル値の場合は機能しません。参考:私はOracle11gを使用しています

4

1 に答える 1

0

CAGEおよび列で使用されていない値を見つけ、 Oracle の関数HCCを使用して NULL 値をこの一意の値に置き換える必要があります。NVLそう:

 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こちらはサンプルです。

2 番目のループについては、次のようになります。

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)

-1印刷では、 back を に置き換えることができますNULL

于 2012-08-27T08:46:11.753 に答える