示例:
DECLARE
v_b1 BOOLEAN := &n1;
v_b2 BOOLEAN := &n2;
BEGIN
IF(v_b1 AND v_b2) THEN
DBMS_OUTPUT.put_line('AND --true');
END IF;
IF(v_b1 OR v_b2) THEN
DBMS_OUTPUT.put_line('OR --true');
END IF;
IF(NOT v_b1) THEN
DBMS_OUTPUT.put_line('b_v1取反为TRUE');
END IF;
END;
e、字符以及数字运算的特点
空值加上数字仍然是空值:NULL + = NULL。
空值加上(连接)字符,结果是字符:NULL || =
7、PLSQL的条件控制语句
- 附加说明:PL/SQL流程控制语句分类:
条件控制语句(条件分支语句):IF语句和CASE语句。
循环语句:LOOP语句。
顺序语句:GOTO语句、NULL语句。
a、条件控制语句:if语句
分为三种条件分支语句:简单条件判断:IF-THEN;二重条件分支:IF-THEN-ELSE;多重条件分支:IF-THEN-ELSIF。
简单条件判断的语法格式:IF condition THEN statements; END IF;
二重条件分支的语法格式:IF condition THEN statements; ELSE statements; END IF;
多重条件分支的语法格式:IF condition THEN statements; ELSIF condition THEN statements; ELSE statements; END IF;
b、条件控制语句:CASE语句
使用CASE语句执行多重条件分支操作,语句更加简捷,执行效率更好。
使用CASE语句处理多重条件分支有两种方法:第一种方法是使用单一选择符进行等值比较;第二种方法是使用多种条件进行非等值比较。
- CASE语句中使用单一选择符进行等值比较的语法格式:
CASE selector
WHEN expression1 THEN sequence_of_statements1;
WHEN expression2 THEN sequence_of_statements2;
......
WHEN expressionN THEN sequence_of_statementsN;
[ELSE sequence_of_statements;]
END CASE;
示例:输入成绩等级,判断属于哪个层次,并打印输出。
DECLARE
v_grade CHAR(1) := '&n';
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
WHEN condition1 THEN sequence_of_statements1;
WHEN condition2 THEN sequence_of_statements2;
......
WHEN conditionN THEN sequence_of_statementsN;
[ELSE sequence_of_statements;]
END CASE;
示例:输入员工号,获取员工工资,判断工资,如果工资小于1500,补助加100,如果工资小于2500,补助加80,如果工资小于5000,补助加50。
DECLARE
v_sal emp01.sal%TYPE;
v_empno emp01.empno%TYPE := &no;
BEGIN
SELECT sal INTO v_sal FROM emp01 WHERE empno = v_empno;
CASE
WHEN v_sal < 1500 THEN
UPDATE emp01 SET comm = nvl(comm, 0) + 100 where empno = v_empno;
WHEN v_sal < 2500 THEN
UPDATE emp01 SET comm = nvl(comm, 0) + 80 where empno = v_empno;
WHEN v_sal < 5000 THEN
UPDATE emp01 SET comm = nvl(comm, 0) + 50 where empno = v_empno;
COMMIT;
END CASE;
END;
c、循环语句:基本循环
语法格式:LOOP statement1; ...... END LOOP;
示例:打印数字1到10:。
DECLARE
v_cnt INT :=1;
BEGIN
LOOP
DBMS_OUTPUT.put_line(v_cnt);
EXIT WHEN v_cnt = 10;
v_cnt := v_cnt + 1;
END LOOP;
END LOOP;
d、循环语句:WHILE循环
语法格式:WHILE condition LOOP statement1; statement2; ...... END LOOP;
DECLARE
v_cnt INT :=1;
BEGIN
while v_cnt <= 10 LOOP
DBMS_OUTPUT.put_line(v_cnt);
v_cnt := v_cnt + 1;
END LOOP;
END ;
e、循环语句:FOR循环
语法格式:
FOR counter in [REVERSE] lower_bound ..upper_bound LOOP
statement1; statement2;
......
END LOOP;
示例:打印从1到10。
BEGIN
FOR i IN 1..10 LOOP
Dbms_Output.put_line(i);
END LOOP;
END;
需要注意,其中i为Oracle的隐含控制变量。
f、循环语句:嵌套循环和控制语句
嵌套循环和标号:嵌套循环是指在一个循环语句中嵌入另一个循环语句;标号用于标记嵌套块或者嵌套循环;使用<>定义标号。
DECLARE
v_result INT;
BEGIN
<>
FOR i IN 1..5 LOOP
<>
FOR j IN 1 .. 5 LOOP
v_result := i;
EXIT outter WHEN i = 4;
END LOOP inner;
DBMS_OUTPUT.put_line('内:' || v_result);
END LOOP outter;
DBMS_OUTPUT.put_line('外:' || v_result);
END;
EXIT和EXIT WHEN语句:EXIT语句用于直接退出当前循环。(EXIT WHEN语句用于在满足条件时退出当前循环)
DECLARE
v_cnt INT :=1;
BEGIN
LOOP
DBMS_OUTPUT.put_line(v_cnt);
EXIT WHEN v_cnt = 10;
v_cnt := v_cnt + 1;
END LOOP;
END;
CONTINUE和CONTINUE WHEN语句:
CONTINUE语句时oracle 11g的新特性,用于直接结束当前循环并继续下一组循环。
CONTINUE WHEN语句用于在满足特定条件时结束当前循环语句并继续下一组循环语句。
DECLARE
v_cnt INT := 0;
BEGIN
LOOP
v_cnt := v_cnt + 1;
CONTINUE WHEN v_cnt = 5;
DBMS_OUTPUT.put_line(v_cnt);
EXIT WHEN v_cnt = 10;
END LOOP;
END;
g、顺序语句
GOTO语句:GOTO语句用于跳转到特定标号处执行语句。
语法格式:GOTO label_name;
注意:当使用GOTO跳转到特定标号时,标号后至少要包含一条执行语句。
示例:打印输出1-10,使用GOTO语句处理。
DECLARE
v_cnt INT := 1;
BEGIN
LOOP
DBMS_OUTPUT.put_line(v_cnt);
IF v_cnt = 10 THEN
GOTO end_loop;
END IF;
v_cnt := v_cnt + 1;
END LOOP;
<>
DBMS_OUTPUT.put_line('循环结束');
END;
NULL语句:NULL语句不会执行任何操作,并且会直接将控制传递到下一个语句,使用该语句的主要目的是提高PL/SQL块的可读性。
BEGIN
SELECT ename, sal INTO v_name, v_sal FROM emp01 WHERE empno = &no;
IF v_sal < 3000 THEN
UPDATE emp01 SET comm = nvl(comm, 0) + sal * 0.2 WHERE ename = v_name;
COMMIT;
DBMS_OUTPUT.put_line(v_name || '的奖金更新了');
ELSE
NULL;
END IF;
END;
温馨提示:之后的Oracle专题代码示例大部分在SQL WINDOW窗口下执行。