pl/sql进阶:控制结构
在任何计算机语言(C, JAVA, PASCAL )都有各种控制语句(条件语句,循环语句,顺序控制结构…)在 pl/sql 中也存在这样的控制结构。
1)if 语句
2)循环语句
3)控制语句—goto 和 null
>>条件分支语句
pl/sql中提供了三种条件分支语句 if -- then, if--then--else, if--then--elsif--else.
A>简单的条件判断 if -- then
?编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该雇员工资增加10%。
create or replace procedure sp_pro6(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;
SQL>exec sp_pro6('SCOTT');
SQL>exec sp_pro6('FORD');
>>二重条件分支 if -- then -- else
?编写一个过程,可以输入一个雇员名,如果该雇员的补助不是0,就在原来的基础上增加100;如果补助为0就把补助设为200。
create or replace procedure sp_pro6(spName varchar2) is
---定义
v_comm emp.comm%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=200 where ename=spName;
end if;
end;
SQL>exec sp_pro6('SCOTT');
SQL>exec sp_pro6('FORD');
>>多重条件分支 if ---then ---elsif ---else
?编写一个过程,可以输入一个雇员编号,如果该雇员的职位是PRESIDENT 就给他的工资增加1000,如果该雇员的职位为 MANAGER 就给他的工资增加500,其职位的雇员工资增加200。
create or replace procedure sp_pro6(spNo number) is
---定义
v_job emp.job%type;
begin
---执行
select job into v_job from emp where empno=spNo;
if v_job='PRESIDENT' 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;
>>循环语句 ---loop
是 pl/sql 中最简单的循环语句,这种循环语句以 loop 开头,以 end loop 结尾,这种循环至少会被执行一次。
案例:有一张 users 表,字段为 用户ID和用户名,请编写一个过程,可输入用户名,并循环添加10个用户到 users 表中,用户编写从1开始增加。
SQL>create tabl users(userNo number, userName varchar2(40);
create or replace procedure sp_pro6(spName varchar2) 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;
SQL>exec sp_pro6('你好');
>>循环语句 ---while循环
基本循环至少要执行循环体一次,而对于 while 循环来说,只有条件为 true时,才会执行循环体语句, while 循环以 while..loop 开始,以 end loop 结束。
案例:现有一张表,表结构为 用户ID和用户名。
编写一个过程,可以输入用户名,并循环添加10个用户到 users表中,用户编号从11开始增加。
create or replace procedure sp_pro6(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;
>>循环语句---for 循环
基本for循环的基本结构如下:
begin
for i in reverse 1..10 loop
insert into users values(i,'tao');
end loop;
end;
/
我们可以看到控制变量i,在隐含中就在不停地增加。
>>顺序控制语句---goto, null
①goto 语句
goto语句用于跳转到特定标号去执行语句(汇编里用得较多)。注意由于使用goto语句会增加程序的复杂性,并使得应用程序的可读性变差,所以在做一般应用开发时,建议不使用goto语句。
基本语法如下 goto label,其中 label 是已经定义好的标号名。
declare
i int :=1;
begin
loop
dbms_output.put_line('输出i='||i);
if i=10 then
goto end_loop;
end if;
i:=i+1;
end loop;
<<end_loop>>
dbms_output.put_line('循环结束');
end;
/
②null
null 语句不会执行任何操作,并且会直接将控制传递到下一条语句。使用null语句的主要好处是可以提高pl/sql的可读性。
里面的 else null可以不要!为了增加可读性!
declare
v_sal emp.sal%type;
v_ename emp.ename%type;
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
if v_sal<3000 then
update emp set comm=sal*0.1 where ename=v_ename;
else
null;
end if;
end;