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;

 

posted @ 2020-04-15 23:00  64Byte  阅读(648)  评论(0编辑  收藏  举报