十三、PL/SQL控制流程
1、数据库赋值
数据库赋值是通过SELECT语句来完成的,每次执行SELECT语句就赋值一次,一般要求被赋值变量与SELECT中的列名要一一对应,不能将SELECT语句中的列赋值给布尔变量。
2、条件语句:
语法1:
IF<布尔表达式> THEN
PL/SQL 和SQL语句;
END IF;
语法2:
IF<布尔表达式> THEN
PL/SQL 和SQL语句;
ELSE
其它语句;
END IF;
语法3
IF <布尔表达式> THEN
PL/SQL 和SQL语句;
ELSIF< 其它布尔表达式> THEN
其它语句;
ELSIF< 其它布尔表达式> THEN
其它语句;
ELSE
其它语句;
END IF;
语法4
CASE 表达式 (switch)
CASEselector
WHENexpression1 THENresult1
WHENexpression2 THENresult2
WHENexpressionN THENresultN
[ ELSEresultN+1]
END;
|实例1|
使用 If then elsif then … else end if;
declare
v_sal student.sal%type;
begin
select sal into v_sal from student where xuehao='12';
if(v_sal>=10000)
then dbms_output.put_line('sal>=10000');
elsif(v_sal>5000 and v_sal<10000)
then dbms_output.put_line('5000<= sal <10000');
else dbms_output.put_line('sal<5000');
end if;
end;
/
|实例2|
使用 case when then when then else end;
备注:该方法很有局限性
declare
v_sal student.sal%type;
v_temp varchar2(30);
begin
select sal into v_sal from student where xuehao='11';
v_temp:=
case trunc(v_sal/5000) when 0 then 'sal<5000'
when 1 then '5000<=sal<10000'
else 'sal>=10000'
end;
dbms_output.put_line(v_temp);
end;
3、循环语句
语法1:loop exit when end loop;
LOOP
要执行的语句;
EXIT WHEN<条件语句> ;/*条件满足,退出循环语句*/
END LOOP;
|实例1|
declare
int number(2):=1;
begin
loop
int :=int+1;
dbms_output.put_line('int的当前值为'||int);
exit when int=10;
end loop;
end;
语法2:WHILE 循环
备注:相较语法1,推荐使用语法2
WHILE<布尔表达式> LOOP
要执行的语句;
END LOOP;
|实例1|
declare
v_num number:=1;
begin
while v_num<=10 loop
dbms_output.put_line('v_num当前的值为:'||v_num);
v_num:=v_num+1;
end loop;
end;
语法3:for循环
FOR循环计数器IN [REVERSE ] 下限.. 上限LOOP (循环计数器也可以理解为是一个变量参数)
要执行的语句;
END LOOP;
备注:for循环主要是对数字式的循环
每循环一次,循环变量自动加1;
使用关键字REVERSE,循环变量自动减1。
跟在IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT退出循环。
|实例1|
循环1到10之间的数字,包含1和10
begin
for int in 1..10 loop
dbms_output.put_line('int的当前值为:'||int);
end loop;
end;
|实例2|
2-100之间的素数
什么是素数/质数:只有1和它本身两个因素的自然数。
A、 对x对2取模 为0 v_flag=0 v_y:=v_y+1
B、
方法1
declare
v_x number:=2;
v_y number:=2;
v_flag number(1):=1;
begin
dbms_output.put_line('质数如下:');
while v_x<=100 loop
while v_y <=sqrt(v_x) loop
if v_x mod v_y=0 then v_flag:=0; end if;
v_y:=v_y+1;
end loop;
if (v_flag=1) then dbms_output.put_line(v_x);
end if;
v_flag:=1;
v_x:=v_x+1;
v_y:=2;
end loop;
end;
方法2
declare
--标记值,若为1,则是素数,否则不是
v_flag number(1):=0;
begin
for x in 2..100 loop
v_flag:=1;
for y in 2..sqrt(x) loop
if x mod y=0 then
v_flag:=0;
goto label;
end if;
end loop;
<<label>>
if v_flag=1 then
dbms_output.put_line(x);
end if;
end loop;
end;
|实例3 |
使用循环语句打印1-100 包含1和100
方法1:LOOP ... EXIT WHEN ... END LOOP
declare
v_x number(3):=1;
begin
loop
--循环体
dbms_output.put_line(v_x);
--循环条件
exit when v_x=100;
--迭代条件
v_x:=v_x+1;
end loop;
end;
方法2:WHILE ... LOOP ... END LOOP
Declare
--初始化参数
v_x number(3):=1;
begin
--循环条件
while v_x<=100 loop
--循环体
dbms_output.put_line(v_x);
--迭代条件
V_x:=v_x+1;
end loop;
end;
方法3:for 循环计数器名字 in 上限值..下限值 loop end loop;
begin
for int in 1..100 loop
dbms_output.put_line(int);
end loop;
end;
|实例4|
打印1——100的自然数,当打印到50时,跳出循环,输出“打印结束”
方法1
Declare
Begin
for i in 1..100 loop
dbms_output.put_line(i);
if(i=50) then
goto label;
end if;
end loop;
<<label>>
dbms_output.put_line('打印结束');
end;
方法2
begin
for i in 1..100 loop
dbms_output.put_line(i);
if(i mod 50=0) then dbms_output.put_line('打印结束');
exit;
end if;
end loop;
end;
/

浙公网安备 33010602011771号