第七章 分支(条件语句)语句
<p>[TOC]</p>
<h1>第七章 分支(条件)语句</h1>
<h2>7.1 PL/SQL 中的布尔条件</h2>
<ul>
<li>布尔值有三个,TRUE,FALSE,NULL </li>
<li>逻辑 AND ,OR ,NOT 与以上三个布尔值使用</li>
<li>AND ,只要有 FALSE 就是 FALSE,除此之外只要有 NULL 就是 NULL</li>
<li>OR ,只要有 TRUE 就是 TRUE,除此之外只要有 NULL 就是 NULL </li>
<li>引出一个问题,表达式写的前后问题</li>
<li>NOT NULL 等于 NULL</li>
</ul>
<h2>7.2 IF语句以及简单IF语句的实例</h2>
<ul>
<li>出现频率较高的条码放 IF 前面,有利提高效率</li>
</ul>
<pre><code>--简单 if 语句
SQL> SET VERIFY OFF
SQL> SET serveroutput ON
DECLARE
v_age NUMBER := & p_age;
BEGIN
IF v_age < 60
THEN
dbms_output.put_line('您不到退休年龄,还必须继续工作为革命事业再做些贡献!!!');
END IF;
END;
--简单if语句,增加一点条件
SQL> SET VERIFY OFF
SQL> SET serveroutput ON
DECLARE
v_age NUMBER := &p_age;
v_gender CHAR(1) := '&p_sex';
BEGIN
IF (v_age BETWEEN 18 AND 35)AND(v_gender = 'F')
THEN
dbms_output.put_line('这位靓女可能成为老板的下任秘书!!!');
END IF;
END;
/</code></pre>
<h2>7.3 IF-THEN-ELSE 和 IF-THEN-ELSIF 语句的执行流程</h2>
<ul>
<li>ELSE 可有可无,如有只能有一个</li>
<li>ELSIF 可以有多个 </li>
</ul>
<h2>7.4 IF-THEN-ELSE 语句的实例</h2>
<pre><code>--两个分支
SQL> SET VERIFY OFF
SQL> SET serveroutput ON
DECLARE
v_shipdate DATE := '&p_shipdate';
v_orderdate DATE := '&p_orderdate';
v_ship_flag VARCHAR2(16);
BEGIN
IF v_shipdate - v_orderdate < 8 THEN
v_ship_flag := 'Acceptable';
dbms_output.put_line('该公司的服务不错!!');
ELSE
v_ship_flag := 'UnAcceptable';
dbms_output.put_line('该公司的服务太差了!!');
END IF;
dbms_output.put_line(v_ship_flag);
END;
/</code></pre>
<p>60 65 80 90 10</p>
<h2>7.5 IF-THEN-ELSIF 语句的实例</h2>
<pre><code>--多个分支
SQL> SET VERIFY OFF
SQL> SET serveroutput ON
DECLARE
v_age NUMBER := &p_age;
BEGIN
IF v_age < 60 THEN
dbms_output.put_line('你年龄<60');
ELSIF v_age < 65 THEN
dbms_output.put_line('你年龄在[60,65)');
ELSIF v_age < 80 THEN
dbms_output.put_line('你年龄在[65,80)');
ELSIF v_age < 90 THEN
dbms_output.put_line('你年龄在[80,90)');
ELSIF v_age < 100 THEN
dbms_output.put_line('你年龄在[90,100)');
ELSE
dbms_output.put_line('你的年龄大于等于100');
END IF;
END;
/</code></pre>
<h2>7.6 CASE 表达式</h2>
<pre><code>--选择CASE表达式,有返回值的
SQL> SET VERIFY OFF
SQL> SET serveroutput ON
DECLARE
v_degree CHAR(1) := UPPER('&p_degree');
v_description VARCHAR2(250);
BEGIN
v_description := CASE v_degree
WHEN 'B' THEN '此人拥有学士学位。'
WHEN 'M' THEN '此人拥有硕士学位。'
WHEN 'D' THEN '此人拥有博士学位。'
ELSE '此人拥有壮士学位'
END;
dbms_output.put_line(v_description);
END;
/
--搜索CASE表达式,有返回值的
SQL> SET VERIFY OFF
SQL> SET serveroutput ON
DECLARE
v_degree CHAR(1) := UPPER('&p_degree');
v_description VARCHAR2(250);
BEGIN
v_description := CASE
WHEN v_degree = 'B' THEN '此人拥有学士学位。'
WHEN v_degree = 'M' THEN '此人拥有硕士学位。'
WHEN v_degree = 'D' THEN '此人拥有博士学位。'
ELSE '此人拥有壮士学位'
END;
dbms_output.put_line(v_description);
END;
/</code></pre>
<h2>7.7 CASE 语句</h2>
<pre><code>--CASE语句无返回值,可以有完成的程序块,需要结束语句end case
SQL> SET VERIFY OFF
SQL> SET serveroutput ON
DECLARE
v_degree CHAR(1) := UPPER('&p_degree');
BEGIN
CASE v_degree
WHEN 'B' THEN
dbms_output.put_line('此人拥有学士学位。');
WHEN 'M' THEN
dbms_output.put_line('此人拥有硕士学位。');
WHEN 'D' THEN
dbms_output.put_line('此人拥有博士学位。');
WHEN 'X' THEN
dbms_output.put_line('此人拥有壮士学位');
ELSE
dbms_output.put_line('没有这一学位');
END CASE;
END;
/
--
SQL> SET VERIFY OFF
SQL> SET serveroutput ON
DECLARE
v_empno NUMBER := &p_empno;
v_ename VARCHAR2(30) ;
v_job emp.job%TYPE;
v_sal emp.sal%TYPE;
BEGIN
SELECT job INTO v_job FROM emp WHERE empno = v_empno;
CASE v_job
WHEN 'SALESMAN' THEN
SELECT empno,ename,job,sal*1.15
INTO v_empno,v_ename,v_job,v_sal
FROM emp
WHERE empno = v_empno ;
dbms_output.put_line(v_job||' '||v_ename||'加薪后的工资为:'||v_sal);
WHEN 'CLERK' THEN
SELECT empno,ename,job,sal*1.20
INTO v_empno,v_ename,v_job,v_sal
FROM emp
WHERE empno = v_empno ;
dbms_output.put_line(v_job||' '||v_ename||'加薪后的工资为:'||v_sal);
WHEN 'ANALYST' THEN
SELECT empno,ename,job,sal*1.25
INTO v_empno,v_ename,v_job,v_sal
FROM emp
WHERE empno = v_empno ;
dbms_output.put_line(v_job||' '||v_ename||'加薪后的工资为:'||v_sal);
WHEN 'MANAGER' THEN
SELECT empno,ename,job,sal*1.40
INTO v_empno,v_ename,v_job,v_sal
FROM emp
WHERE empno = v_empno ;
dbms_output.put_line(v_job||' '||v_ename||'加薪后的工资为:'||v_sal);
ELSE
SELECT job,ename,sal INTO v_job,v_ename,v_sal FROM emp WHERE empno = v_empno;
dbms_output.put_line(v_job||' '||v_ename||'无加薪计划,工资依然是:'||v_sal);
END CASE;
END;
/</code></pre>
<h2>7.8 GOTO 语句</h2>
<pre><code>--goto能不用就不用
SQL> SET VERIFY OFF
SQL> SET serveroutput ON
DECLARE
v_num NUMBER := &p_num;
v_count NUMBER := 0 ;
BEGIN <<loop_start>>
IF v_count = 0 THEN
dbms_output.put_line(v_count||'这个数为:0。');
ELSIF v_count < 2 THEN
dbms_output.put_line(v_count||'这个数小于2。');
ELSIF (v_count MOD 2 ) <> 0 THEN --不能被2整除
dbms_output.put_line(v_count||'是奇数。');
ELSE
dbms_output.put_line(v_count||'是偶数。');
END IF ;
v_count := v_count + 1;
IF v_count <= v_num THEN
GOTO loop_start;
END IF;
END;
/</code></pre>