欢迎来到 Oracle PL/SQL 编程入门 的第五章!在这一章中,我们将深入探讨 PL/SQL 中的另一种条件控制结构——CASE
语句。通过学习 CASE
语句和 Searched CASE
语句,你将能够编写更加灵活和高效的程序逻辑。此外,我们还将介绍 NULLIF
和 COALESCE
函数,帮助你更好地处理 NULL 值。准备好迎接新的挑战了吗?让我们开始吧!
CASE
语句是 PL/SQL 中用于多分支条件判断的一种结构,它可以根据不同的条件执行不同的代码块。相比嵌套的 IF-ELSIF
结构,CASE
语句通常更加简洁和易读,CASE语句的执行流程如下图所示:
CASE
语句有两种形式:简单 CASE
语句和 Searched CASE
语句。首先我们来看看简单 CASE
语句的用法。
DECLARE
v_grade CHAR(1) := 'A';
BEGIN
CASE v_grade
WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('优秀');
WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('良好');
WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('合格');
ELSE DBMS_OUTPUT.PUT_LINE('不合格');
END CASE;
END;
/
优秀
小贴士:CASE 语句让选择更优雅
CASE
语句就像是一个自动售货机,根据你投入的“硬币”(条件)吐出相应的“商品”(结果)。它不仅使代码更加简洁,还能让你的逻辑更加清晰。
Searched CASE
语句允许你在每个 WHEN
子句中使用布尔表达式,这使得它可以处理更复杂的条件判断。
DECLARE
v_salary NUMBER := 5000;
BEGIN
CASE
WHEN v_salary > 6000 THEN DBMS_OUTPUT.PUT_LINE('薪资高于6000');
WHEN v_salary BETWEEN 4000 AND 6000 THEN DBMS_OUTPUT.PUT_LINE('薪资在4000到6000之间');
ELSE DBMS_OUTPUT.PUT_LINE('薪资低于4000');
END CASE;
END;
/
薪资在4000到6000之间
小贴士:Searched CASE 更加灵活
Searched CASE
语句就像是一个多选项的投票箱,你可以根据不同的条件放入不同的选票。它的灵活性让它成为处理复杂条件判断的理想选择。
简单 CASE
语句和 Searched CASE
语句的主要区别在于条件的形式:
CASE
语句:比较的是变量与常量值。Searched CASE
语句:每个 WHEN
子句是一个布尔表达式。-- 简单 CASE 语句
DECLARE
v_grade CHAR(1) := 'A';
BEGIN
CASE v_grade
WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('优秀');
WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('良好');
WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('合格');
ELSE DBMS_OUTPUT.PUT_LINE('不合格');
END CASE;
END;
/
-- Searched CASE 语句
DECLARE
v_salary NUMBER := 5000;
BEGIN
CASE
WHEN v_salary > 6000 THEN DBMS_OUTPUT.PUT_LINE('薪资高于6000');
WHEN v_salary BETWEEN 4000 AND 6000 THEN DBMS_OUTPUT.PUT_LINE('薪资在4000到6000之间');
ELSE DBMS_OUTPUT.PUT_LINE('薪资低于4000');
END CASE;
END;
/
小贴士:选择合适的 CASE 形式
选择合适的形式就像挑选适合的工具,简单
CASE
适用于直接比较变量和常量的情况,而Searched CASE
则适用于更复杂的条件判断。合理选择可以让你的代码更加简洁和高效。
CASE
表达式是一种可以在 SQL 查询中使用的条件表达式,类似于 CASE
语句,但它返回一个值而不是执行一系列语句。
DECLARE
v_grade CHAR(1) := 'B';
v_result VARCHAR2(10);
BEGIN
-- 使用 CASE 表达式
v_result := CASE v_grade
WHEN 'A' THEN '优秀'
WHEN 'B' THEN '良好'
WHEN 'C' THEN '合格'
ELSE '不合格'
END;
DBMS_OUTPUT.PUT_LINE('评级: ' || v_result);
END;
/
评级: 良好
小贴士:CASE 表达式让查询更智能
CASE
表达式就像是 SQL 查询中的智能助手,它可以根据不同的条件动态地生成结果。合理使用CASE
表达式可以让你的查询更加灵活和强大。
在处理数据库时,经常会遇到 NULL 值的问题。PL/SQL 提供了两个有用的函数来处理这些情况:NULLIF
和 COALESCE
。
NULLIF
函数用于比较两个表达式,如果它们相等,则返回 NULL;否则返回第一个表达式的值。
DECLARE
v_value1 NUMBER := 100;
v_value2 NUMBER := 100;
v_result NUMBER;
BEGIN
-- 使用 NULLIF 函数
v_result := NULLIF(v_value1, v_value2);
IF v_result IS NULL THEN
DBMS_OUTPUT.PUT_LINE('两个值相等,返回 NULL');
ELSE
DBMS_OUTPUT.PUT_LINE('两个值不相等,返回 ' || v_result);
END IF;
END;
/
两个值相等,返回 NULL
小贴士:NULLIF 让比较更智能
NULLIF
函数就像是一个聪明的比较器,当两个值相等时,它会返回 NULL,从而避免不必要的重复处理。合理使用NULLIF
可以简化你的代码逻辑。
下面是一个实际应用的例子,假设我们要从数据库中获取员工的绩效评分,并将其与目标评分进行比较。
DECLARE
v_actual_score NUMBER := 85;
v_target_score NUMBER := 85;
v_result NUMBER;
BEGIN
-- 使用 NULLIF 函数
v_result := NULLIF(v_actual_score, v_target_score);
IF v_result IS NULL THEN
DBMS_OUTPUT.PUT_LINE('实际评分等于目标评分,返回 NULL');
ELSE
DBMS_OUTPUT.PUT_LINE('实际评分不等于目标评分,返回 ' || v_result);
END IF;
END;
/
实际评分等于目标评分,返回 NULL
COALESCE
函数用于返回其参数中第一个非 NULL 的值。如果有多个参数,它会依次检查每个参数,直到找到第一个非 NULL 的值为止。
DECLARE
v_value1 NUMBER := NULL;
v_value2 NUMBER := 100;
v_value3 NUMBER := 200;
v_result NUMBER;
BEGIN
-- 使用 COALESCE 函数
v_result := COALESCE(v_value1, v_value2, v_value3);
DBMS_OUTPUT.PUT_LINE('第一个非 NULL 的值是: ' || v_result);
END;
/
第一个非 NULL 的值是: 100
小贴士:COALESCE 让处理 NULL 更轻松
COALESCE
函数就像是一个过滤器,它会帮你找出第一个非 NULL 的值。合理使用COALESCE
可以让你的代码更加健壮,减少因 NULL 值导致的错误。
下面是一个实际应用的例子,假设我们要从数据库中获取员工的多个联系方式,并返回第一个有效的联系方式。
DECLARE
v_phone1 VARCHAR2(15) := NULL;
v_phone2 VARCHAR2(15) := '123-456-7890';
v_phone3 VARCHAR2(15) := '987-654-3210';
v_result VARCHAR2(15);
BEGIN
-- 使用 COALESCE 函数
v_result := COALESCE(v_phone1, v_phone2, v_phone3);
DBMS_OUTPUT.PUT_LINE('第一个有效的电话号码是: ' || v_result);
END;
/
第一个有效的电话号码是: 123-456-7890
在编写 PL/SQL 代码时,有一些常见问题需要注意,以避免潜在的错误和性能问题。
虽然 CASE
语句比嵌套的 IF-ELSIF
结构更简洁,但仍然要注意不要过度嵌套子句。尽量保持代码简洁明了。
确保条件表达式准确无误,尤其是在使用 Searched CASE
语句时,仔细检查每个条件是否符合预期。
在处理 NULL 值时,合理使用 NULLIF
和 COALESCE
函数,可以有效避免因 NULL 值导致的错误。
现在是时候来挑战一下自己了!我们将通过几个简单的练习来巩固所学的知识。
编写一个 PL/SQL 块,根据员工的绩效评分来决定其评级。
DECLARE
v_performance_score NUMBER := &performance_score; -- 输入绩效评分
v_rating VARCHAR2(10);
BEGIN
-- 使用 CASE 表达式
v_rating := CASE
WHEN v_performance_score >= 90 THEN '优秀'
WHEN v_performance_score >= 70 THEN '良好'
WHEN v_performance_score >= 50 THEN '合格'
ELSE '不合格'
END;
DBMS_OUTPUT.PUT_LINE('评级: ' || v_rating);
END;
/
85
。评级: 良好
。编写一个 PL/SQL 块,根据员工的多个联系方式,返回第一个有效的联系方式。
DECLARE
v_phone1 VARCHAR2(15) := NULL; -- 输入第一个电话号码
v_phone2 VARCHAR2(15) := '&phone2'; -- 输入第二个电话号码
v_phone3 VARCHAR2(15) := '&phone3'; -- 输入第三个电话号码
v_result VARCHAR2(15);
BEGIN
-- 使用 COALESCE 函数
v_result := COALESCE(v_phone1, v_phone2, v_phone3);
DBMS_OUTPUT.PUT_LINE('第一个有效的电话号码是: ' || v_result);
END;
/
123-456-7890
和 987-654-3210
。第一个有效的电话号码是: 123-456-7890
。小贴士:动手实践是最好的老师
理论知识固然重要,但真正的技能提升来自于不断的实践。通过这些挑战,你可以加深对 PL/SQL 的理解,并发现自己可能忽略的小细节。勇敢地面对每一个挑战,你会发现编程其实并没有那么难!
在这一章中,我们深入探讨了 PL/SQL 中的条件控制结构——CASE
语句以及 NULLIF
和 COALESCE
函数。以下是本章的主要内容总结:
CASE
语句和 Searched CASE
语句的使用方法。CASE
表达式。NULLIF
函数的使用方法,用于比较两个值并返回 NULL。COALESCE
函数的使用方法,用于返回第一个非 NULL 的值。恭喜你完成了第五章的学习!通过这节课,你已经掌握了 PL/SQL 中的条件控制结构和处理 NULL 值的方法,并为后续更高级的内容打下了坚实的基础。未来的学习中,我们将继续探索 PL/SQL 的更多功能,如循环结构、存储过程等。希望你能继续保持对 PL/SQL 的兴趣,勇敢探索,成为一名熟练的 PL/SQL 用户!