Sign In/My Account | View Cart  

advertisement

AddThis Social Bookmark Button

Article:
  Native Compilation, CASE, and Dynamic Bulk Binding
Subject:   Author's reply to "Problem with the examples?"
Date:   2003-01-22 12:42:09
From:   bllewell
We presented two examples on p.3...


CREATE OR REPLACE FUNCTION
grade_translator (grade_in IN VARCHAR2)
RETURN VARCHAR2
IS
retval VARCHAR2(100);
BEGIN
CASE
WHEN grade_in = 'A'
THEN retval := 'Excellent';
WHEN grade_in = 'B'
THEN retval := 'Very Good';
WHEN grade_in = 'C'
THEN retval := 'Good';
WHEN grade_in = 'D'
THEN retval := 'Fair';
WHEN grade_in = 'F'
THEN retval := 'Poor';
ELSE retval := 'No such grade';
END CASE;
RETURN retval;
END;


...and...


CREATE OR REPLACE FUNCTION
grade_translator (grade_in IN VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
RETURN
CASE
WHEN grade_in = 'A'
THEN 'Excellent'
WHEN grade_in = 'B'
THEN 'Very Good'
WHEN grade_in = 'C'
THEN 'Good'
WHEN grade_in = 'D'
THEN 'Fair'
WHEN grade_in = 'F'
THEN 'Poor'
ELSE 'No such grade'
END;
END;


While they both do compile and run OK, chrisrimmer is right - they're not the best examples of good style.


In the case that the WHEN at every leg is an equality test on the same expression, then you should pull it out to the top of the CASE as you show.


So we should have used an example like this...


FUNCTION
grade_translator (grade_in IN VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
RETURN
CASE
WHEN grade_in = 'A'
THEN 'Excellent'
WHEN grade_in = 'B'
THEN 'Very Good'
WHEN grade_in = 'C'
THEN 'Good'
WHEN grade_in IN ('D', 'E', 'F' )
THEN 'Could do better'
ELSE 'No such grade'
END;
END;


Thanks! Bryn.