DECODE
is an old function that has been replaced by the easier to understand and more common CASE
. Unlike
DECODE
, CASE
may also be used directly within PL/SQL.
Noncompliant code example
SET SERVEROUTPUT ON
DECLARE
operand CHAR(1) := 'B';
l_result PLS_INTEGER;
BEGIN
-- Noncompliant
SELECT DECODE(operand, 'A', 1
, 'B', 2
, 'C', 3
, 'D', 4
, 'E', 5
, 'F', 6
, 7)
INTO l_result
FROM dual;
DBMS_OUTPUT.PUT_LINE('l_result = ' || l_result); -- 2
END;
/
Compliant solution
SET SERVEROUTPUT ON
DECLARE
operand CHAR(1) := 'B';
l_result PLS_INTEGER;
BEGIN
l_result := CASE operand
WHEN 'A' THEN 1
WHEN 'B' THEN 2
WHEN 'C' THEN 3
WHEN 'D' THEN 4
WHEN 'E' THEN 5
WHEN 'F' THEN 6
ELSE 7
END;
DBMS_OUTPUT.PUT_LINE('l_result = ' || l_result); -- 2
END;
/
Exceptions
No issue is raised when DECODE
contains only one case (i.e. only one search
and one result
components)
because using CASE
would make the code less readable in this scenario.