"Traditional" Approach: Use IF
CREATE OR REPLACE FUNCTION grade_translator (grade_in IN VARCHAR2)
RETURN VARCHAR2
IS
retval VARCHAR2 (100);
BEGIN
IF grade_in = 'A'
THEN
retval := 'Excellent';
ELSIF grade_in = 'B'
THEN
retval := 'Very Good';
ELSIF grade_in = 'C'
THEN
retval := 'Good';
ELSIF grade_in = 'D'
THEN
retval := 'Fair';
ELSIF grade_in = 'F'
THEN
retval := 'Poor';
ELSE
retval := 'No such grade';
END IF;
RETURN retval;
END;
Function created.
The CASE Version
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;
Function created.
BEGIN
DBMS_OUTPUT.put_line (grade_translator ('A'));
END;
Excellent
Even More Concise - CASE within RETURN!
CREATE OR REPLACE FUNCTION grade_translator (grade_in IN VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
RETURN CASE grade_in
WHEN 'A' THEN 'Excellent'
WHEN 'B' THEN 'Very Good'
WHEN 'C' THEN 'Good'
WHEN 'D' THEN 'Fair'
WHEN 'F' THEN 'Poor'
ELSE 'No such grade'
END;
END;
Function created.
BEGIN
DBMS_OUTPUT.put_line (grade_translator ('A'));
END;
Excellent
CASE with Searched Expression
DECLARE -- Example of CASE searched expression
cant_play_now BOOLEAN;
how_young INTERVAL YEAR TO MONTH
:= (SYSDATE - TO_DATE ('09-23-1958', 'MM-DD-YYYY')) YEAR TO MONTH;
max_age CONSTANT INTERVAL YEAR TO MONTH := INTERVAL '16' YEAR;
min_age CONSTANT INTERVAL YEAR TO MONTH := INTERVAL '70' YEAR;
PROCEDURE must_go_to_work
IS
BEGIN
DBMS_OUTPUT.PUT_LINE ('Oh well....');
END;
BEGIN
-- Notice: no semi-colons between WHEN clauses.
cant_play_now :=
CASE
WHEN how_young < min_age THEN FALSE
WHEN how_young > max_age THEN FALSE
ELSE TRUE
END;
IF cant_play_now
THEN
must_go_to_work;
END IF;
END;
Statement processed.
CASE with Embedded CASE
CREATE OR REPLACE FUNCTION days_in_period_str (period_in IN VARCHAR2
, days_in IN PLS_INTEGER)
RETURN VARCHAR2
IS
BEGIN
/*
1. If days_in is 1, then use singular, else use plural for period
(add an "s" to "day" in output).
2. If days_in is NULL, then display "No days in <period_in>".
*/
RETURN CASE
WHEN days_in IS NULL THEN 'No'
WHEN days_in = 1 THEN 'One'
ELSE TO_CHAR (days_in)
END
|| ' '
|| CASE days_in WHEN 1 THEN 'day' ELSE 'days' END
|| ' in '
|| period_in;
END;
Function created.
CASE with Embedded CASE
BEGIN
DBMS_OUTPUT.put_line (days_in_period_str ('Month', 1));
DBMS_OUTPUT.put_line (days_in_period_str ('Month', 2));
DBMS_OUTPUT.put_line (days_in_period_str ('Month', NULL));
END;
One day in Month
2 days in Month
No days in Month