1. 条件语句
if salary > 40000 or salary is NULL
then
give_bonus(employee_id, 500);
end if;
if condition
then
---
else
---
end if;
if condition
then
statement1
elsif condition
then
statement2
else
statement3
end if;
例如:
IF salary >= 10000 AND salary <=20000 THEN
give_bonus(employee_id, 1500);
ELSIF salary > 20000 AND salary <= 40000 THEN
give_bonus(employee_id, 10000);
ELSIF salary > 40000 THEN
give_bouns(employee_id, 400);
END IF;
嵌套的 IF 语句
IF condition 1 THEN
IF codition 2 THEN
IF condition 3 THEN
statement 3
END IF;
statement 2
END IF;
statement 1
END IF;
像这种嵌套最好不要超过3层, 否则就比较难理解和维护.
2. case 语句
case expression
when result1 then
statement1
when result2 then
statement2
else
statement_else
end case;
例如:
CASE employee_type
WHEN 'S' THEN
award_salary_bonus(employee_id);
WHEN 'H' THEN
award_hourly_bonus(employee_id);
WHEN 'C' THEN
award_commissioned_bonus(employee_id);
ELSE
RAISE invalid_employee_type;
END CASE;
case 作出 if else 效果
CASE TRUE
WHEN salary >= 10000 AND salary <= 20000 THEN
give_bouns(employee_id, 1500);
WHEN salary > 20000 AND salary < 40000 THEN
give_bouns(employee_id, 1000);
ELSE
give_bouns(employee_id, 0);
END CASE;
搜索CASE 模型
CASE
WHEN salary > 40000 THEN
give_bonus(employee_id, 1500);
WHEN salary > 20000 THEN
give_bonus(employee_id, 1000);
ELSE
give_bonus(employee_id, 0);
END CASE;
CASE 规则:
- 一旦某些语句被执行, 整个执行也就结束了, 即便下边还有结果满足case的表达式, 换言之, 这里的case 自动带有 break,
- ELSE 语句是可选的, 如果没有指定 ELSE,并且没有一个表达式求值结果是 true, 就会抛出 CASE_NOT_FOUND 异常.
- WHEN 表达式是按照从上到下的顺序被依次求值.
另外 CASE 语句的边界重叠问题, 要注意, 尽量让 CASE 的条件之间没有任何重叠部分.
CASE 表达式
简单型 CASE 表达式, 例如: (case 后边接表达式, 而这个表达式是我们想要的)
declare
boolean_true BOOLEAN := TRUE;
boolean_false BOOLEAN := FALSE;
boolean_null BOOLEAN;
FUNCTION boolean_to_varchar2(flag IN BOOLEAN) RETURN VARCHAR2 IS
BEGIN''
RETURN
CASE flag
WHEN TRUE THEN 'True'
WHEN FALSE THEN 'False'
ELSE 'NULL'
END;
END;
BEGIN
DBMS_OUTPUT.PUT_LINE(boolean_to_varchar2(boolean_true));
DBMS_OUTPUT.PUT_LINE(boolean_to_varchar2(boolean_false));
DBMS_OUTPUT.PUT_LINE(boolean_to_varchar2(boolean_null));
END;
复杂类型的 case 表达式, case后边不接表达式, 例如:
declare
salary NUMBER := 20000;
employee_id NUMBER := 36325;
bonus_amount NUMBER;
BEGIN
bonus_amount :=
CASE
WHEN salary >= 10000 AND salary <= 20000 THEN 1500
WHEN salary > 20000 AND salary <= 40000 THEN 1000
WHEN salary > 40000 THEN 500
ELSE 0
END * 10; -- 注意这步将结果乘以 10 了
DBMS_OUTPUT.PUT_LINE(bonus_amout);
END;
与 CASE 语句不同, 即使 CASE 表达式中没有 WHEN 子句被选择也不会抛出异常, 相反, 如果没有WHEN条件被满足, CASE 表达式就会返回 NULL.
只要可以使用其他类型表达式的地方, 就可以使用 CASE 表达式, 另外, case表达式只用一个 END; 来作为结尾.
NULL 语句
当你想让 PLSQL 什么也不做时, 就可以使用 NULL 语句, 例如:
IF condition THEN
statment1
ELSE
null; -- do nothing
END IF;