2012-5-22 22:33 休息
2012-5-22 23:06
7.1 条件分支语句
条件分支语句用于依据特定情况选择要执行的操作。
PL/SQL提供了三种条件分支语句:IF-THEN,IF-THEN-ELSE,IF-THEN-ELSIF
语法如下:
if condition then
statements;
[elsif condition then
statements;]
[else
statements;]
end if;
1.简单条件判断(用于执行单一条件判断)
declare
v_sal emp.sal%type;
begin
select sal into v_sal from emp where lower(ename)=lower('&name');
if v_sal<2000 then
update emp set sal=v_sal+200
where lower(ename)=lower('&name');
end if;
end;
select * from emp where ename='SMITH'
2.二重条件分支(根据条件来选择两种可能性)
语法:if..then..else...
declare
v_comm number(6,2);
begin
select comm into v_comm from emp where empno=&no;
if v_comm<>0 then
update emp set comm=v_comm+100 where empno=&no;
else
update emp set comm=200 where empno=&no;
end if;
end;
select * from emp where empno='7934'
3.多重条件分支(用于执行最复杂的条件分支操作)
当使用多重条件分支时,如果满足第一个条件,则执行第一种操作;如果不满足第一个条件,则检查是否满足第二个条件,如果满足
第二个条件,则执行第二种操作;如果不满足第二个条件,则检查是否第三个条件,依此类推。如果所有条件都为false或null,那么
p/sql执行器会执行else后的操作。多重条件分支是使用if..then..elsif语句来完成的。
declare
v_job emp.job%type;
v_sal emp.sal%type;
begin
select job,sal into v_job,v_sal
from emp where empno=&no;
if v_job='PRESIDENT' THEN
UPDATE EMP SET sal=v_sal+1000 where empno=&no;
elsif v_job='MANAGER' THEN
update emp set sal=v_sal+500 where empno=&no;
else
update emp set sal=v_sal+200 where empno=&no;
end if;
end;
select * from emp where empno='7788'
2.case语句
1.在CASE语句中使用单一选择符进行等值比较
当使用CASE语句执行多重条件分支时,如果条件选择符完全相同,并且条件表达式为相等条件选择,那么可以选择单一条件选择符进
行等值比较。语法
case selector(条件选择符)
when expression1(指定条件值的表达式) then 要执行的条件操作
when expression2 then
else
end case;
如果设置的所有条件都不满足,则会执行else后的语句
例子:
declare
v_deptno emp.deptno%type;
begin
v_deptno:=&no;
case v_deptno
when 10 then
update emp set comm=100 where deptno=v_deptno;
when 20 then
update emp set comm=80 where deptno=v_deptno;
when 30 then
update emp set comm=50 where deptno=v_deptno;
else
dbms_output.put_line('不存在该部门的编号');
end case;
end;
2.在case语句中使用多种条件比较
如果包含有多种条件进行不等比较,那么必须在when子句中指定比较条件,语法如下:
case
when search_condition1 then 当满足特定条件时要执行的操作
when search_condition2 then 当满足特定条件时要执行的操作
else
end case;
例子
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;
case
when v_sal<1000 then
update emp set comm=100 where ename=v_ename;
when v_sal<2000 then
update emp set comm=80 where ename=v_ename;
when v_sal<6000 then
update emp set comm=50 where ename=v_ename;
end case;
end;
select * from emp where ename='SCOTT'
2012-5-23 14:00
7.3循环语句(为了在编写的PL/SQL中重复执行一条语句或一组语句)
1.基本循环
以LOOP开始,以END LOOP结束,其语法如下:
LOOP
statement1'
...
exit [when condition];
END LOOP;
如上所示,当使用基本循环时,无论是否满足条件,语句至少会被执行一次。当Condition为true时,会退出循环,并执行END LOOP
后的相应操作。注意,当编写基本循环时,一定要包含EXIT语句,否则PL/SQL会陷入死循环;另外当使用基本循环时,大家还应该定义
循环控制变量,并且在循环体内修改循环控制变量的值。
实例
create table temp (cola int);
declare
i int:=1;
begin
LOOP
INSERT INTO temp VALUES (i);
exit when i=5;
i:=i+1;
end LOOP;
END;
SELECT * FROM TEMP;
2.WHILE循环
只有条件为true时,才会执行循环体内的语句。
while循环以while..loop开始,以end loop结束。
语法
while condition loop
statement1;
statement2;
end loop;
如上所示,当condition为true时,PL/SQL执行器会执行循环体内的语句;否则会退出循环,并执行END LOOP后的语句。
注意,当编写WHILE循环时,应该定义循环控制变量,并且在循环体内修改循环控制变量的值。
declare
i int:=1;
begin
WHILE i<=10 LOOP
INSERT INTO temp VALUES (i);
i:=i+1;
end LOOP;
END;
3.FOR循环
当使用基本循环或while循环时,需要定义循环控制变量,并且循环控制变量不仅可以使用number类型,也可以使用其他数据类型;
而当使用FOR循环时,Oracle会隐含定义循环控制变量。FOR循环的语法如下:
FOR counter in [REVERSE]
lower_bound..upper_bound LOOP
statement1;
statement2;
...
end LOOP;
如上所示,counter是循环控制变量,并且该变量由Oracle隐含定义,不需要显示定义;
lower_bound和upper_bound分别对应于循环控制变量的下届值和上届值。默认情况下,当使用FOR循环时,每次循环时循环控制变量
会自动增一;如果指定REVERSE选项,那么每次循环时循环控制变量会自动减一。
实例:
begin
for i in 1..10 loop
insert into temp values (i);
end loop;
end;
4.嵌套循环和标号
嵌套循环是指在一个循环语句之中嵌入另个循环语句,而标号则用于标记嵌套块或嵌套循环。通过在嵌套循环中使用标号,可以区分
内层循环和外层循环,并且可以在内层循环中直接退出外层循环。使用<<>>定义标号
declare
result int;
begin
<<outer>>
for i in 1..100 loop
<<inter>>
for j in 1..100 loop
result:=i*j;
exit outer when result=1000;
exit when result=500;
end loop inner;
dbms_output.put_line(result);
end loop outer;
dbms_output.put_line(result);
end;
2012-05-23 22:17
7.4 顺序控制语句
1.GOTO
GOTO语句用于跳转到特定标号处去执行语句。注意,GOTO语句会增加程序的复杂性,可读性变差。
GOTO label_name;
label_name是已经定义的标号名。注意,当使用GOTO跳转到特定标号时,标号后至少要包含一条可执行语句。
SQL> declare
2 i int:=1;
3 begin
4 loop
5 insert into temp values (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 /
循环结束
2.null
null语句不会执行任何操作,并且会直接将控制传递到下一条语句。使用null语句的主要好处是可以提高PL/SQl程序的可读性
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;