简单 CASE 语句 (PL/SQL)

简单 CASE 语句尝试使表达式(被称为选择器)与一个或多个 WHEN 子句中指定的另一表达式匹配。发生匹配将导致执行一条或多条相应的语句。

语法

阅读语法图跳过直观语法图CASE选择器表达式WHEN匹配表达式THENstatements ELSEstatements END CASE

描述

CASE 选择器表达式
指定一个表达式,此表达式的值的数据类型与每个 匹配表达式 兼容。如果 选择器表达式 的值与第一个 匹配表达式 匹配,那么将执行相应 THEN 子句中的语句。如果没有匹配项,那么将执行相应 ELSE 子句中的语句。如果没有匹配项,并且没有 ELSE 子句,那么将抛出异常。
WHEN 匹配表达式
指定要在 CASE 语句中进行求值的表达式。如果 选择器表达式 与某个 匹配表达式 匹配,那么将执行相应 THEN 子句中的语句。
THEN
此关键字引入要在相应布尔表达式求值为 TRUE 时执行的语句。
statement
指定一个或多个 SQL 或 PL/SQL 语句,每个语句都以分号终止。
ELSE
此关键字引入 CASE 语句的缺省情况。

示例

以下示例使用简单 CASE 语句将部门名称和地点指定给基于部门编号的变量。
DECLARE
    v_empno         emp.empno%TYPE;
    v_ename         emp.ename%TYPE;
    v_deptno        emp.deptno%TYPE;
    v_dname         dept.dname%TYPE;
    v_loc           dept.loc%TYPE;
    CURSOR emp_cursor IS SELECT empno, ename, deptno FROM emp;
BEGIN      
    OPEN emp_cursor;
    DBMS_OUTPUT.PUT_LINE('EMPNO    ENAME     DEPTNO    DNAME     '
        || '     LOC');
    DBMS_OUTPUT.PUT_LINE('-----    -------   ------    ----------'
        || '     ---------');
    LOOP
        FETCH emp_cursor INTO v_empno, v_ename, v_deptno;
        EXIT WHEN emp_cursor%NOTFOUND;
        CASE v_deptno
            WHEN 10 THEN v_dname := 'Accounting';
                         v_loc   := 'New York';
            WHEN 20 THEN v_dname := 'Research';
                         v_loc   := 'Dallas';
            WHEN 30 THEN v_dname := 'Sales';
                         v_loc   := 'Chicago';
            WHEN 40 THEN v_dname := 'Operations';
                         v_loc   := 'Boston';
            ELSE v_dname := 'unknown';
                         v_loc   := '';
        END CASE;
        DBMS_OUTPUT.PUT_LINE(v_empno || '     ' || RPAD(v_ename, 10) ||
            '  ' || v_deptno || '      ' || RPAD(v_dname, 14) || ' ' ||
            v_loc);
    END LOOP;
    CLOSE emp_cursor;
END;
此程序返回以下样本输出:
EMPNO    ENAME     DEPTNO    DNAME          LOC
-----    -------   ------    ----------     ---------
7369     SMITH       20      Research       Dallas
7499     ALLEN       30      Sales          Chicago
7521     WARD        30      Sales          Chicago
7566     JONES       20      Research       Dallas
7654     MARTIN      30      Sales          Chicago
7698     BLAKE       30      Sales          Chicago
7782     CLARK       10      Accounting     New York
7788     SCOTT       20      Research       Dallas
7839     KING        10      Accounting     New York
7844     TURNER      30      Sales          Chicago
7876     ADAMS       20      Research       Dallas
7900     JAMES       30      Sales          Chicago
7902     FORD        20      Research       Dallas
7934     MILLER      10      Accounting     New York