3.分支控制语句
分支控制语句我理解的是根据不同的条件做出不同的执行。
分支控制语句主要分为2类:
if 语句块:使用if_else 等语句块处理分支控制。
case 语句块:使用case 语句块处理分支控制。
1. if 语句块进行处理 declare v_count number(10):=0; --定义计时器变量 v_emp number(4):=7888; --定义员工编号 begin select count(1) into v-count from emp where empno=&v_empno; --使用if 语句判断,如果员工编号不存在,结果为0 if v_count =0 then -- 则执行insert语句,插入新的员工记录 insert into emp (empno,ename,job,hiredate,sal,daptno ) values(v_empno,'张三','经理',trunc(sysdate),1000,20); end if; -- 向数据库提交更改 commit; exception when others then dbms_output.put_line(sqlerrm); -- 输出异常信息 end;
2.if_then_if 示例 declare v_count number(10):=0; -- 定义计数器变量 v_empno number(4):=7888; --定义员工编号 begin select count(1) --首先查询指定的员工编号是否存在 into v_count from emp where empno =v_empno; -- 使用if 语句判断,如果员工编号不存在,结果为0 if v_count=0 then insert into emp (empno,ename,job,hiredate,sal,deptno ) values(v_empno,'张三','经理',trunc(syadate),1000,20 ); else -- 否则执行update 语句更新员工信息 update emp set ename='张三', job='经理', hiredate= trunc(sysdate); sal= 1000, daptno=20, where empno =v_empno; end if; -- 向数据库提交更改 commit; exception when others then dbms_output.put_line(sqlerrm);-- 输出异常信息 end;
3.嵌套 if语句 declare v_sal number(7,2); -- 薪资变量 v_deptno number(2); -- 部门变量 v_job varchar2(9); -- 职位变量 begin -- 从数据库中查询指定员工编号的信息、 select deptno,v_job,sal into v_deptno,v_job,v_sal from emp where empno =:empno; -- 如果部门编号为20的员工 if v_job ='clerk' then -- 如果职别为clerk if v_job ='clerk' then -- 加薪0.12 v_sal :=v_sal *(1+0.12); -- 如果职别为 analyst elsif v_job ='analyst' then -- 加薪0.19 v_sal :=v_sal*(0.19); end if; -- 否则,不为20的员工将不允许加薪 else dbms_output.put_line('进部门编号为 20的员工才能加薪'); end if; end;
4.if-then-else 分支 declare v_character char(1) :=&tmpvar; --定义替换变量 begin if v_character='A' -- 判断字符是否为‘A’,如果不是,则跳到下一个elsif then dbms_output.put_line('当前输出字符串:'||v_character); elsif v_v_character='B' --判断字符是否为‘B’,如果不是,则跳到下一个elsif then dbms_output.put_line('当前输出字符串:'||v_character); elsif v_v_character='C' --判断字符是否为‘c’,如果不是,则跳到下一个elsif then dbms_output.put_line('当前输出字符串:'||v_character); elsif v_v_character='D' --判断字符是否为‘D’,如果不是,则跳到下一个elsif then dbms_output.put_line('当前输出字符串:'||v_character); else dbms_output_put_line('不是A-D之间的字符')‘ end if; end;
5.简单的case 分支 declare v_job varchar2(30); --定义保存case 选择器的字符型变量 v_empno number(4) :=&empno; --定义用来查询员工的员工编号 begin select job --获取选择器v_job的值 into v_job from emp where empno=v_empno; --当指定了case的选择器为v_job后,所有的when 子句的类型必须匹配varchar2类型 case v_job when 'clerk' then update emp set sal =sal *(1+0.15) where empno =v_empno; dbms_output.put_line('为不同职员加薪15%'); when 'analyst' then update emp set sal= sal*(1+0.18) where empno =v_empno; dbms_output.put_line('为分析人员加薪18%'); when 'manager' then update emp set sal =*(1+0.20) where empno =v_empno; dbms_output.put_line('为管理人员加薪20%'); when 'salesman' then update emp set sal =sal *(1+0.22) where empno=v_empno; dbms_output.put_line('为销售人员加薪22%'); else -- 使用else 语句显示信息 dbms_output.put_line('员工职级不在加薪的行列'); end case; end;
6.搜索case 语句 eclare v_sal number(10,2); -- 定义保存薪水的变量 v_empno number(10) :=&empno; -- 用来查询的员工编号 begin select sal into v_sal from emp where empno =v_empno; -- 使用搜索case 语句,判断员工薪资级别 case when v_sal between 1000 and 1500 then dbms_output.put_line('员工级别:初级职员'); when v_sal between 1500 and 3000 then dbms_output.put_line('员工级别:中级管理'); when v_sal between 3000 and 5000 then dbms_output.put_line('员工级别:高级经理'); else dbms_output.put_line('不在级别范围之内'); end case; end;