I have these three select statements and I am trying to return null to the variable vCLASS1_ID or vCLASS2_ID or  vCLASS3_ID  when no data is found. 
  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;
I tried to solve that problem by below ways, but I fail
return null using EXCEPTION when no_data_found then to variable will not solve my problem since the function will stop running 
I tried to use NULLIF function as below but that will not return null when there is where clause and when I remove the where clause I will not get a single record:
SELECT NULLIF (CLASS1_DESC, 'EXAMPLE') AS CLASS1_DESC
    FROM PRODUCT_CLASSIFICATION
---WHERE CLASS1_DESC = 'EXAMPLE'
GROUP BY CLASS1_DESC  
Any other simple ways to do it ?
Does the declaring 3 courser is the better solution ?
"using EXCEPTION when no_data_found then to variable will not solve my problem since the function will stop running"
Use anonymous blocks to define local exception sections. This approach allows you to handle each occurrence separately without causing the larger program unit to abend.
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;        
The above solution is a general approach to handling exceptions. However, the solution suggested by @MaheswaranRavisankar to this particular problem (set variable to null when no data found) requires less typing:
      SELECT max(CLASS3_ID) 
      INTO vCLASS3_ID
        FROM PRODUCT_CLASSIFICATION
       WHERE CLASS3_DESC = 'EXAMPLE';
The potential catch with this approach is that it would return no rows if we go with the OP's original formulation:
 SELECT max(CLASS3_ID) 
      INTO vCLASS3_ID
        FROM PRODUCT_CLASSIFICATION
       WHERE CLASS3_DESC = 'EXAMPLE'
 GROUP BY CLASS3_ID;
It is not clear why the OP is using GROUP BY in their original queries. If the table has potential for duplicate CLASSn_IDs then the correct approach is either:
However, if neither of those will satisfy the remaining open approach is
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;    
                        I think it can be done by use outer join
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
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With