Oracle--pl/sql编程-分支语句(判断、循环)
if语句
oracle: elsif java: else if
if (条件) then pl/sql或sql语句 [elsif (条件) then ] ...可以有多个elsif [else] end if; ---必须写 结束大括号
例:
--完成根据员工的编号查看员工需要交的税的情况 大于等于3000交1% 大于等于1500交 0.5%,低于1500的不要交税 declare v_empno emp.empno%type; v_sal emp.sal%type; v_name emp.ename%type; v_rate emp.sal%type; --需要交的税 begin v_empno :='&请输入员工编号'; select ename,sal into v_name,v_sal from emp where empno = v_empno; if v_sal >= 3000 then v_rate := v_sal*0.01; elsif v_sal >= 1500 then v_rate := v_sal*0.005; else v_rate := 0; end if; dbms_output.put_line('编号为'||v_empno||'的员工姓名:' || v_name ||',薪水:'||v_sal||',需要交的税:'||v_rate); end;
swicth结构:oracle 的case -decode 是对case的简写
case 等值判断
类似于java的switch
case 表达式 when 值1 then ... when 值2 then ... ... else ... end case ;
例:
--查询员工的岗位, 显示的中文的 declare v_empno emp.empno%type := '&请输入员工的编号'; v_job emp.job%type; v_cJob emp.job%type; begin select job into v_job from emp where empno = v_empno; case v_job when 'CLERK' then v_cJob :='文员'; when 'SALESMAN' then v_cJob :='销售'; when 'MANAGER' then v_cJob :='主管'; when 'ANALYST' then v_cJob :='研发'; when 'PRESIDENT' then v_cJob :='董事长'; else v_cJob := '未知'; end case; dbms_output.put_line(v_cJob); end;
case 范围判断,等值(类似if)
case when 条件 then ... when 条件 then ... ... else ... end case;
例:
declare v_empno emp.empno%type; v_sal emp.sal%type; v_name emp.ename%type; v_rate emp.sal%type; --需要交的税 begin v_empno :='&请输入员工编号'; select ename,sal into v_name,v_sal from emp where empno = v_empno; /* if v_sal >= 3000 then v_rate := v_sal*0.01; elsif v_sal >= 1500 then v_rate := v_sal*0.005; else v_rate := 0; end if; */ case when v_sal >= 3000 then v_rate := v_sal*0.01; when v_sal >= 1500 then v_rate := v_sal*0.005; else v_rate := 0; end case; dbms_output.put_line('编号为'||v_empno||'的员工姓名:' || v_name ||',薪水:'||v_sal||',需要交的税:'||v_rate); end;
if ,case if不能再sql语句中使用, case 可以在sql语句中使用
--查询员工的信息,以及 >=3000 高新, >=1500 中等收入, <1500 底薪 收入情况 -- 注意: *** sql语句中使用case, 不能使用end case, 使用end; -- 而pl/sql块, case 的结束是一定使用 end case; --decode() 函数, 在sql使用, 简化 case等值判断, -- 在sql中使用范围判断, 使用case select e.*, case when e.sal >=3000 then '高新' when e.sal >=1500 then '中等收入' else '底薪' end 收入情况 from emp e;
loop 循环 常用
Loop Pl/SQL 语句 exit when 循环结束的条件; end loop;
例:
--输出10次hello world declare v_str varchar2(30) :='hello world'; i number := 0; begin -- 类似do-while loop --oracle 没有 ++ -- i+=1 i:= i+1; --输出helloworld dbms_output.put_line(i||':'||v_str); --退出循环 exit when i = 10; end loop; end;
while 循环
while 条件 loop --代码 end loop;
例:
--使用while来实现 declare v_str varchar2(30) := 'hello world'; i number := 0; begin while i<10 loop i := i+1; dbms_output.put_line(i||':'||v_str); end loop; end;
for循环
从小到大: for i in 最小值..最大值 loop sql语句 end loop; i从小值, 每循环一次, 加1 , 加到最大值结束 从大到小: for i in reverse 最小值..最大值 loop sql语句 end loop; i从最大值, 每循环一次, 减1 , 减到最大值结束 --注意 这个i不需要我们声明
例:
-- 累加操作: 1+ 2+...+100 declare sum1 number := 0; begin for i in 1..100 loop sum1 := sum1 + i; end loop; DBMS_OUTPUT.PUT_LINE ('1到100的累加的和:'||sum1); end; --打印 10,9,8,7,...1 begin for i in reverse 1..10 loop dbms_output.put_line(i); end loop; end;