Oracle条件分支语句使用案例
pl/sql中提供了三种条件分支语句if---thenif---then---elseif--then---elsif---else。这里需要注意一个细节(细节决定成败):elsif而不是elseif
一:简单的条件判断:if--then
案例1:编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该雇员工资增加10%
create or replace procedure sp_p2(spName varchar2) is
v_sal emp.sal%type;
begin
select  sal into v_sal from emp where ename=spName;
if  v_sal<2000 then
update emp set sal=sal*1.1 where ename=spName;
end if;
end;
案例2:修改emp表的数据,把那些小于2000的员工工资增加10%,并把更新前后的工资显示出来。
create or replace procedure sp_p2(spName varchar2) is --执行存储过程时要用的变量。
  v_sal emp.sal%type;
  v_sal1 emp.sal%type;              --定义两个与emp表中sal列的字符类型相同。
    begin
    select sal into v_sal from emp where ename=spName;--把得到的数据存到变量里边。
    if v_sal<2000 then
    update emp set sal=sal*1.1 where ename=spName;
    select sal into v_sal1 from emp where ename=spName;
    dbms_output.put_line('旧工资为:'||v_sal); --表的列不能在这里用,需要通过定义变量和存储值来实现。
    dbms_output.put_line('新工资为:'||v_sal1);
    end if;
    end;
  /
SQL> exec sp_p2('SMITH');--调用存储过程
while语句里的if
旧工资为:880
新工资为:968
PL/SQL procedure successfully completed
二:二重条件分支if--then--else
案例3:编写一个过程,可以输入一个雇员名如果该雇员的补助不是0,就在原来的基础上增加100;如果补助为零设为200.
create or replace procedure sp_p2(spName varchar2) is
v_comm empm%type;
begin
select  comm into v_comm from emp where ename=spName;
if  v_comm<>0 then
update emp set comm=comm+100 where ename=spName;
else
update emp set comm=comm+200 where ename=spName;
end if;
end;
注:此案例有只能更新为0或者大于零的,null的不能修改。
案例4:弥补案例3的不足,此案例comml列为空的也可以进行修改。
create or replace procedure sp_p2(spName varchar2) is
v_comm empm%type;
begin
select  comm into v_comm from emp where ename=spName;
if  v_comm is null or v_comm = 0 then
update emp set comm=nvl(comm,0)+100 where ename=spName;
else
update emp set comm=comm+200 where ename=spName;
end if;
end;
注:nvl(comm,0)comm为空时返回零,不为空则返回comm值。
三::重条件分支if--then---elsif---else
案例5:编写一个过程,可以输入一个雇员编号,如果该雇员的职位是persident就给他的工资增加1000,如果该雇员的职位是MANAGER就给他的工资增加500,其他职位的雇员工资增加200.
create or replace procedure sp_p3(spNo number) is
v_job emp.job%type;
begin
select job into v_job from emp where empNo=spNo;
if v_job='PERSIDENT' then
update emp set sal=sal+1000 where empno=spNo;
elsif v_job='MANAGER' then
update emp set sal=sal+500 where empno=spNo;
else
update emp set sal=sal+200 where empno=spNo;
end if;
end;
四:循环体
案例1:最简单的循环loop,以loop开头,以end loop结束。这种循环至少执行一次。建一张表users:用户id,用户名userName。编写一个过程,可输入用户名,并循环的添加10个用户到users表中,用户编号从1开始。 (:=表示赋值)
(1)create table users(userNO number,userName varchar2(40));
2create or replace procedure sp_p4(spNname number) is
v_num number:=1;
begin
loop
insert into users values(v_num,spName);
exit when v_num=10--判断是否要退出循环
v_num:=v_num+1;--自增
end loop;
end;
3exec sp_p4('xx');--调用存储过程
案例2:(loop/end loop结束)编写一个过程,可输入用户名,并循环的添加10个用户到users表中,用户编号从11开始。现有一张表users:用户id,用户名。
1create or replace procedure sp_p5(spName varchar2) is
v_num number:=11;
begin
while v_num<20
loop
insert into users values(v_num,spName);
v_num:=v_num+1;
end loop;
end;
end;
2exec sp_p5('xxb');

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。