2017-03-09 75 views
0

我有這三個選擇語句,我試圖返回null變量vCLASS1_IDvCLASS2_IDvCLASS3_ID當沒有數據被發現時。如何返回空當選擇語句返回沒有找到數據

SELECT MAX (CLASS1_ID), MAX(CLASS1_DESC) 
    INTO vCLASS1_ID, vCLASS1_DESC 
    FROM PRODUCT_CLASSIFICATION 
    WHERE CLASS1_DESC = P_CLASS1_DESC 
GROUP BY CLASS1_ID, CLASS1_DESC; 

    SELECT MAX (CLASS2_ID),MAX(CLASS2_DESC) 
    INTO vCLASS2_ID,vCLASS2_DESC 
    FROM PRODUCT_CLASSIFICATION 
    WHERE CLASS2_DESC = P_CLASS2_DESC 
GROUP BY CLASS2_ID, CLASS2_DESC; 

    SELECT MAX (CLASS3_ID),MAX(CLASS3_DESC) 
    INTO vCLASS3_ID,vCLASS3_DESC 
    FROM PRODUCT_CLASSIFICATION 
    WHERE CLASS3_DESC = P_CLASS3_DESC 
GROUP BY CLASS3_ID, CLASS3_DESC; 

我試圖解決由下面的方法這個問題,但我用EXCEPTION when no_data_found then變量不會解決我的問題,因爲該功能將停止運行

  • 我嘗試失敗

    • return null使用NULLIF函數如下,但不會返回null當有wher e子句和當我刪除where子句我不會得到一個單一的記錄:

      SELECT NULLIF (CLASS1_DESC, 'EXAMPLE') AS CLASS1_DESC FROM PRODUCT_CLASSIFICATION ---WHERE CLASS1_DESC = 'EXAMPLE' GROUP BY CLASS1_DESC

    任何其他簡單的方法來做到這一點?

    宣稱3 courser是更好的解決方案嗎?

  • +0

    只是'MAX(CLASS1_ID)'(或任何聚合函數)會做。它實際上將MAX()放在空結果集上,該結果集將返回null。順便說一句,您可以將每個sql嵌入到'BEGIN END;'中,以便您不處理任何數據。 –

    +1

    我想當他使用GROUP BY子句時,即使使用MAX()也不會返回任何東西。 – Ming

    +0

    @你是對的,謝謝! 'MAX(MAX(CLASS1_ID))'工作.. –

    回答

    2

    「使用異常時NO_DATA_FOUND然後變量不會解決我的問題,因爲該功能將停止運行」

    使用匿名塊定義局部異常部分。這種方法允許您分別處理每個事件,而不會導致較大的程序單元異常終止。

    begin 
         SELECT CLASS1_ID 
         INTO vCLASS1_ID 
         FROM PRODUCT_CLASSIFICATION 
         WHERE CLASS1_DESC = 'EXAMPLE'; 
    exception 
        when no_data_found then 
         vCLASS1_ID := null; 
    end;   
    
    begin 
         SELECT CLASS2_ID 
         INTO vCLASS2_ID 
         FROM PRODUCT_CLASSIFICATION 
         WHERE CLASS2_DESC = 'EXAMPLE'; 
    exception 
        when no_data_found then 
         vCLASS2_ID := null; 
    end;   
    
    begin 
         SELECT CLASS3_ID 
         INTO vCLASS3_ID 
         FROM PRODUCT_CLASSIFICATION 
         WHERE CLASS3_DESC = 'EXAMPLE'; 
    exception 
        when no_data_found then 
         vCLASS3_ID := null; 
    end;   
    

    上面的解決方案是異常處理的一般方法。然而,@MaheswaranRavisankar建議這個特殊問題(組變量時,沒有發現數據爲空)的解決方案需要更少的輸入:

     SELECT max(CLASS3_ID) 
         INTO vCLASS3_ID 
         FROM PRODUCT_CLASSIFICATION 
         WHERE CLASS3_DESC = 'EXAMPLE'; 
    

    的潛在產量這種方法是,如果我們一起去,將不返回行OP的原始公式:

    SELECT max(CLASS3_ID) 
         INTO vCLASS3_ID 
         FROM PRODUCT_CLASSIFICATION 
         WHERE CLASS3_DESC = 'EXAMPLE' 
    GROUP BY CLASS3_ID; 
    

    不清楚爲什麼OP在其原始查詢中使用GROUP BY。如果表中有重複的CLASSn_IDs潛在那麼正確的做法可以是:

    • 投擲和處理TOO_MANY_ROWS異常,如果有重複
    • 要應用的建立目前有效的類ID的業務規則

    但是,如果那些都將滿足剩餘的開放式方法是

    begin 
         SELECT CLASS3_ID 
         INTO vCLASS3_ID 
         FROM PRODUCT_CLASSIFICATION 
         WHERE CLASS3_DESC = 'EXAMPLE' 
         GROUP BY CLASS3_ID; 
    exception 
        when no_data_found then 
         vCLASS3_ID := null; 
    end;  
    
    +0

    使用'MAX函數'將返回沒有數據,因爲羣組通過..請查看我的發佈更新的查詢,這就是爲什麼我使用'group by'只是錯過了更新疑問之前發帖抱歉 – sam

    +0

    你是對我的朋友我擔心重複的CLASSn_IDs,根據你的回答,我必須使用匿名來處理錯誤「TOO_MANY_ROWS」和「沒有數據發現」我是否理解你對我的朋友? – sam

    +0

    您需要使用匿名塊來處理NO_DATA_FOUND。您也可以選擇處理TOO_MANY_ROWS異常或使用GROUP BY將其禁用 – APC

    1

    我認爲它可以通過使用外完成加入

    WITH TEMP AS (SELECT 'EXAMPLE' AS VAL FROM DUAL) 
    SELECT T1.CLASS1_ID 
        --INTO vCLASS1_ID 
        FROM PRODUCT_CLASSIFICATION T1, 
         TEMP T2 
        WHERE T1.CLASS1_DESC(+) = T2.VAL 
    GROUP BY T1.CLASS1_ID 
    
    相關問題