PL/SQLのCASE文のELSEって省略できない
PL/SQLを実行すると、
エラーコード: ORA-06592
詳細: CASE文の実行中にCASEが見つかりません
となってしまった場合は、 OracleのPL/SQLに記載したCASE WHEN ... END CASEでELSEを省略している可能性あり。
https://www.366service.com/jp/qa/82975fbbfe8c0f01d07862451289b7c4
oracle公式のマニュアル (https://docs.oracle.com/cd/E15817_01/appdev.111/e05670/controlstructures.htm)[4 PL/SQLの制御構造の使用] の「例4-6 単純なCASE文」を見ると、
SQL> DECLARE 2 grade CHAR(1); 3 BEGIN 4 grade := 'B'; 5 6 CASE grade 7 WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('Excellent'); 8 WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('Very Good'); 9 WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('Good'); 10 WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE('Fair'); 11 WHEN 'F' THEN DBMS_OUTPUT.PUT_LINE('Poor'); 12 ELSE DBMS_OUTPUT.PUT_LINE('No such grade'); 13 END CASE; 14 END; 15 / Very Good PL/SQL procedure successfully completed. SQL>
とあり、
選択子の後に1つ以上のWHEN句があり、各句が順番にチェックされます。
選択子の値によって、どの句が実行されるかが決定されます。
選択子の値がWHEN句の式の値と等しければ、そのWHEN句が実行されます。
たとえば、最後の例では、gradeが'C'であれば、'Good'が出力されます。
実行が失敗することはなく、WHEN句が1つでも実行されると、制御が次の文に渡されます。
ELSE句の機能は、IF文のELSE句に似ています。
前述の例では、学年がWHEN句のオプションの1つでなければ、ELSE句が選択され、'No such grade'という句が出力されます。
ELSE句はオプションです。
ただし、ELSE句を省略すると、PL/SQLでは次の暗黙的なELSE句が追加されます。
ELSE RAISE CASE_NOT_FOUND;
という説明がある。 省略すると「CASEがないとエラーを上げます」ってこと。 つまり、PL/SQLのELSEは省略できないってことだよね。紛らわしい。