PL/SQL流程控制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PL/SQL流程控制相关的知识,希望对你有一定的参考价值。
1 数据库赋值
数据库赋值是通过SELECT语句来完成的,每次执行SELECT语句就赋值一次,一般要求被赋值变量与SELECT中的列名要一一对应。
2 不能将SELECT语句中的列赋值给布尔变量
3 条件语句
IF<布尔表达式> THEN
PL/SQL 和SQL语句;
END IF;
IF<布尔表达式> THEN
PL/SQL 和SQL语句;
ELSE
其它语句;
END IF;
IF <布尔表达式> THEN
PL/SQL 和SQL语句;
ELSIF< 其它布尔表达式> THEN
其它语句;
ELSIF< 其它布尔表达式> THEN
其它语句;
ELSE
其它语句;
END IF;
CASE 表达式 (switch)
CASEselector
WHENexpression1 THENresult1
WHENexpression2 THENresult2
WHENexpressionN THENresultN
[ ELSEresultN+1]
END;
例子:
/*使用 IF ... THEN ... ELSIF ... THEN ...ELSE ... END IF;
要求: 查询出 150号 员工的工资, 若其工资大于或等于 10000 则打印 ‘salary >= 10000‘;
若在 5000 到 10000 之间, 则打印 ‘5000<= salary < 10000‘; 否则打印 ‘salary < 5000‘*/
declare
v_salary employees.salary%type;
begin
select salary into v_salary
from employees
where employee_id=150;
if(v_salary>=10000) then dbms_output.put_line(‘salary >= 10000‘);
elsif (v_salary>5000 and v_salary<10000) then dbms_output.put_line(‘5000<= salary < 10000‘);
else dbms_output.put_line(‘salary <5000‘);
end if;
end;
方法2
/*使用 IF ... THEN ... ELSIF ... THEN ...ELSE ... END IF;
要求: 查询出 150号 员工的工资, 若其工资大于或等于 10000 则打印 ‘salary >= 10000‘;
若在 5000 到 10000 之间, 则打印 ‘5000<= salary < 10000‘; 否则打印 ‘salary < 5000‘*/
declare
v_salary employees.salary%type;
v_temp varchar2(30);
begin
select salary into v_salary
from employees
where employee_id=150;
v_temp:=
case trunc(v_salary/5000) when 0 then ‘salary<5000‘
when 1 then ‘5000<= salary< 10000‘
else ‘salary >=10000‘
end;
dbms_output.put_line(v_temp);
end;
这种方法很有局限性
4 循环
1. 简单循环
LOOP
要执行的语句;
EXIT WHEN<条件语句> ;/*条件满足,退出循环语句*/
END LOOP;
例3.
DECLARE
int NUMBER(2) :=0;
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;
例4.
DECLARE
x NUMBER :=1;
BEGIN
WHILE x<=10 LOOP
DBMS_OUTPUT.PUT_LINE(‘X的当前值为:‘||x);
x:= x+1;
END LOOP;
END;
3 数字式循环(for循环)
FOR循环计数器IN[REVERSE ] 下限.. 上限LOOP
要执行的语句;
END LOOP;
每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1。跟在IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT退出循环。
例5.
BEGIN
FOR int in 1..10 LOOP
DBMS_OUTPUT.PUT_LINE(‘int 的当前值为: ‘||int);
END LOOP;
END;
例子
--求2-100之间的素数
declare
v_i number(3):=2;
v_j number(3):=2;
v_flag number (1):=1;
begin
dbms_output.put_line(‘质数如下:‘);
while v_i<=100 loop
while v_j<=sqrt(v_i) loop
if v_i mod v_j=0 then v_flag:=0; end if;
v_j:=v_j+1;
end loop;
if (v_flag=1) then dbms_output.put_line(v_i); end if;
v_flag:=1;
v_i:=v_i+1;
v_j:=2;
end loop;
end;
第二种方法
declare
v_flag number (1):=1;
begin
dbms_output.put_line(‘质数如下:‘);
for i in 2..100 loop
for j in 2..sqrt(i) loop
if(i mod j =0) then v_flag:=0; goto label; end if;
end loop;
<< label >>
if(v_flag=1) then dbms_output.put_line(i); end if;
v_flag:=1;
end loop;
end;
其他例子
9. 使用循环语句打印 1 - 100.(三种方式)
1). LOOP ... EXIT WHEN ... END LOOP
declare
--初始化条件
v_i number(3) := 1;
begin
loop
--循环体
dbms_output.put_line(v_i);
--循环条件
exit when v_i = 100;
--迭代条件
v_i := v_i + 1;
end loop;
end;
2). WHILE ... LOOP ... END LOOP
declare
--初始化条件
v_i number(3) := 1;
begin
--循环条件
while v_i <= 100 loop
--循环体
dbms_output.put_line(v_i);
--迭代条件
v_i := v_i + 1;
end loop;
end;
3).
begin
for i in 1 .. 100 loop
dbms_output.put_line(i);
end loop;
end;
10. 综合使用 if, while 语句, 打印 1 - 100 之间的所有素数
(素数: 有且仅用两个正约数的整数, 2, 3, 5, 7, 11, 13, ...).
declare
v_flag number(1):=1;
v_i number(3):=2;
v_j number(2):=2;
begin
while (v_i<=100) loop
while v_j <= sqrt(v_i) loop
if (mod(v_i,v_j)=0) then v_flag:= 0;
end if;
v_j :=v_j +1;
end loop;
if(v_flag=1) then dbms_output.put_line(v_i);
end if;
v_flag :=1;
v_j := 2;
v_i :=v_i +1;
end loop;
end;
(法二)使用for循环实现1-100之间的素数的输出
declare
--标记值, 若为 1 则是素数, 否则不是
v_flag number(1) := 0;
begin
for i in 2 .. 100 loop
v_flag := 1;
for j in 2 .. sqrt(i) loop
if i mod j = 0 then
v_flag := 0;
end if;
end loop;
if v_flag = 1 then
dbms_output.put_line(i);
end if;
end loop;
end;
11. 使用 goto
declare
--标记值, 若为 1 则是素数, 否则不是
v_flag number(1) := 0;
begin
for i in 2 .. 100 loop
v_flag := 1;
for j in 2 .. sqrt(i) loop
if i mod j = 0 then
v_flag := 0;
goto label;
end if;
end loop;
<<label>>
if v_flag = 1 then
dbms_output.put_line(i);
end if;
end loop;
end;
11+.打印1——100的自然数,当打印到50时,跳出循环,输出“打印结束”
(方法一)
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;
(方法二)
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;
以上是关于PL/SQL流程控制的主要内容,如果未能解决你的问题,请参考以下文章