控制结构
1、条件分支语句
1)分为
- if--then
- if--then--else
- if--then--elsif--else
2)简单条件判断if--then
- 编写一个过程,可以输入一个雇员名,如果该雇员名的工资低于2000,就给该雇员工资增加10%
SQL> --编写一个过程,可以输入一个雇员名,如果该雇员名的工资低于2000,就给该雇员工资增加10% SQL> create or replace procedure sp_proc3(spName varchar2) is 2 --定义 3 v_sal emp.sal%type; 4 begin 5 select sal into v_sal from emp where ename=spName; 6 --判断 7 if v_sal<2000 then 8 update emp set sal=sal+sal*0.1 where ename=spName; 9 end if; 10 end; 11 / Procedure created
SQL> exec sp_proc3('SCOTT'); PL/SQL procedure successfully completed
3)二重条件分支if--then--else
- 编写一个过程,可以输入一个雇员名,如果该雇员名的补助不是0,就在原来的基础上增加100;如果补助为0,就把补助设为200。
SQL> --编写一个过程,可以输入一个雇员名,如果该雇员名的补助不是0,就在原来的基础上增加100; SQL> --如果补助为0,就把补助设为200。 SQL> create or replace procedure sp_proc4(spName varchar2) is 2 --定义 3 v_comm emp.comm%type; 4 begin 5 select comm into v_comm from emp where ename=spName; 6 --判断 7 if v_comm<>0 then 8 update emp set comm=comm+100 where ename=spName; 9 else 10 update emp set comm=comm+200 where ename=spName; 11 end if; 12 end; 13 / Procedure created
4)多重条件分支if--then--elseif--else
- 编写一个过程,可以输入一个雇员编号,如果该雇员名的职位是president,就给他的工资增加100;如果该雇员的职位是manager,就给他的工资增加500,其它职位的雇员工资增加200。
SQL> --编写一个过程,可以输入一个雇员编号,如果该雇员名的职位是president,就给他的工资增加100; SQL> create or replace procedure sp_proc5(spNo number) is 2 v_job emp.job%type; 3 begin 4 select job into v_job from emp where empno=spNo; 5 if v_job='PRESIDENT' then 6 update emp set sal=sal+1000 where empno=spNo; 7 elsif v_job='MANAGER' then 8 update emp set sal=sal+500 where empno=spNo; 9 else 10 update emp set sal=sal+200 where empno=spNo; 11 end if; 12 end; 13 / Procedure created
2、循环语句
1)分为
- loop
- while
- for
2)循环语句loop
- pl/sql中最简单的循环语句。
- 以loop开头,以end loop结尾,至少被执行一次。
- 案例:现有一张表users,表结构如下:
编写一个过程,可输入用户名,并循环添加10个用户到users表中,用户编号从1开始增加。
SQL> --编写一个过程,可输入用户名,并循环添加10个用户到users表中, SQL> --用户编号从1开始增加。 SQL> create or replace procedure sp_proc6(spName varchar2) is 2 --定义 3 v_num number:=1; 4 begin 5 loop 6 insert into users values(v_num,spName); 7 --判断退出条件 8 exit when v_num=10; 9 --自增 10 v_num:=v_num+1; 11 end loop; 12 end; 13 / Procedure created
SQL> exec sp_proc6('你好'); PL/SQL procedure successfully completed
SQL> select * from users; USERNO USERNAME ---------- ---------------------------------------- 1 你好 2 你好 3 你好 4 你好 5 你好 6 你好 7 你好 8 你好 9 你好 10 你好 10 rows selected
3)循环语句while
- 案例:现有一张表users,表结构如下:
编写一个过程,可输入用户名,并循环添加10个用户到users表中,用户编号从11开始增加。SQL> --编写一个过程,可输入用户名,并循环添加10个用户到users表中, SQL> --用户编号从11开始增加。 SQL> create or replace procedure sp_proc7(spName varchar2) is 2 --定义 3 v_num number:=11; 4 begin 5 while v_num<=20 loop 6 insert into users values(v_num,spName); 7 v_num:=v_num+1; 8 end loop; 9 end; 10 / Procedure created
4)循环语句--fo循环
- 基本for循环的基本解耦股如下:
begin for i in reverse 1..10 loop insert into users values(i,'小红' ); end loop; end;
3、顺序控制语句
1)分为:
- goto语句
- null语句
2)goto语句
- 用于跳转到特定标号去执行语句。
- 注意:由于使用gogo语句会增加程序的复杂性,并使得应用程序可读性变差,因此建议不要使用goto语句。
- 基本语法:goto lable,其中lable是已经定义好的标号名。
SQL> declare 2 i int:=1; 3 begin 4 loop 5 dbms_output.put_line('输出i='||i); 6 if i=10 then 7 goto end_loop; 8 end if; 9 i:=i+1; 10 end loop; 11 <<end_loop>> 12 dbms_output.put_line('循环结束'); 13 end; 14 / 输出i=1 输出i=2 输出i=3 输出i=4 输出i=5 输出i=6 输出i=7 输出i=8 输出i=9 输出i=10 循环结束 PL/SQL procedure successfully completed
3)null
- null语句不会执行任何操作,并且会直接将控制传递到下一条语句。
- 好处:提高pl/sql的可读性。
SQL> declare 2 v_sal emp.sal%type; 3 v_ename emp.ename%type; 4 begin 5 select ename,sal into v_ename,v_sal from emp where empno=&no; 6 if v_sal<3000 then 7 update emp set comm=sal*0.1 where ename=v_ename; 8 else 9 null; 10 end if; 11 end; 12 / PL/SQL procedure successfully completed