Oracle PL/SQL中CASE语句分号与END用法差异疑问
Oracle PL/SQL中CASE结构的分号使用差异
先看两段PL/SQL代码:
第一段代码:
declare v_name varchar2(10) := 'bruce'; v_name2 number; begin case v_name when 'bruce' then DBMS_OUTPUT.PUT_LINE('corr'); else DBMS_OUTPUT.PUT_LINE('incorrect'); end case; DBMS_OUTPUT.PUT_LINE(v_name2); end;
第二段代码:
declare v_name varchar2(10) := 'bruce'; num number(2) := 10; begin num := case v_name when 'bruce' then 2 else 12 end; DBMS_OUTPUT.PUT_LINE(num); end;
问题
为何第一段代码中需使用END CASE;结尾且分号不可省略,而第二段代码仅需END;结尾即可?已知第二段是对变量赋值,但仍不理解此语法差异的原因。
解答
这本质是CASE语句和CASE表达式的语法区别:
- 第一段里的是CASE语句:它是一个独立的可执行语句,用来根据条件执行不同的PL/SQL操作(比如这里的
DBMS_OUTPUT.PUT_LINE)。作为完整的语句,必须用END CASE;来闭合,分号是PL/SQL语句的结束标记,不能省略。 - 第二段里的是CASE表达式:它不是独立语句,而是一个能返回值的表达式,作用是根据条件计算出一个结果值,用来给变量
num赋值。表达式本身不需要CASE关键字闭合,只需要END来结束表达式,然后整个赋值语句(num := ...;)用分号收尾。
简单总结:
- 当用CASE执行操作(调用过程、输出内容等),它是独立语句,必须写
END CASE; - 当用CASE生成值(赋值、作为函数参数等),它是表达式,只需要写
END,再跟着外层语句的分号
内容的提问来源于stack exchange,提问作者Guna Nikunj
相关产品推荐
相关产品推荐

