検索 CASE ステートメント (Searched CASE statement) (PL/SQL)

検索 CASE ステートメント (Searched CASE statement) では、1 つ以上の Boolean 式を使用して、実行するステートメントを特定します。

構文

構文図を読む構文図をスキップするCASE WHENboolean-expressionTHENstatementsELSEstatementsEND CASE

説明

CASE
CASE ステートメントにおける 1 番目の WHEN 節の開始を示すキーワード。
WHEN boolean-expression
評価される式を指定します。式の評価は、この式を定義した WHEN 節に制御フローが入る際に行われます。 boolean-expression が TRUE と評価されると、対応する THEN 節内のステートメントが実行されます。 boolean-expression が TRUE と評価されない場合は、対応する ELSE 節内のステートメントが実行されます。
THEN
対応する Boolean 式が TRUE と評価された場合に実行するステートメントの開始を示すキーワード。
statements
1 つ以上の 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
            WHEN v_deptno = 10 THEN v_dname := 'Accounting';
                                    v_loc   := 'New York';
            WHEN v_deptno = 20 THEN v_dname := 'Research';
                                    v_loc   := 'Dallas';
            WHEN v_deptno = 30 THEN v_dname := 'Sales';
                                    v_loc   := 'Chicago';
            WHEN v_deptno = 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