Oracle之PL/SQL学习笔记之结构控制(四)
1. if 条件控制语句
if语句有三种使用方式:
• if ...
• if ... else
• if ... elsif ... ... else
以上三种方式可以根据实际的业务需要灵活选择。需要注意的是,三种情况if结束后都必须是以: end if;结束if条件语句。
1.1 if ...
begin
if 1>0 then
dbms_output.put_line('1>0');
end if;
end;
begin
if 1>0 then
dbms_output.put_line('1>0');
end if;
end;
1.2 if ... else ....
begin
if 1>=0 then
dbms_output.put_line('1>=0');
else
dbms_output.put_line('1<0');
end if;
end;
begin
if 1>=0 then
dbms_output.put_line('1>=0');
else
dbms_output.put_line('1<0');
end if;
end;
1.3 if ... elsif ... elsif ....... else ...
declare
v_score number(3);--成绩
begin
v_score:=&no;--接收控制台输入的值,并且赋值给v_score
if v_score<60 then
dbms_output.put_line('同学需要努力...重修吧');
elsif v_score<=70 then
dbms_output.put_line('一般,刚刚及格');
elsif v_score<=80 then
dbms_output.put_line('良好');
else
dbms_output.put_line('优秀');
end if;
end;
declare
v_score number(3);--成绩
begin
v_score:=&no;--接收控制台输入的值,并且赋值给v_score
if v_score<60 then
dbms_output.put_line('同学需要努力...重修吧');
elsif v_score<=70 then
dbms_output.put_line('一般,刚刚及格');
elsif v_score<=80 then
dbms_output.put_line('良好');
else
dbms_output.put_line('优秀');
end if;
end;
注意: &no &符号是接收控制台输入 ,:=是赋值操作,记得if结束 end if;
2. case 条件控制语句
case语句同if语句类似,也是根据条件选择对应的语句执行。
case有两种形式:
1. 给出一个表达式,并且把表达式表达式结果同提供的几个可预见的结果做比较,如果比较成功,则执行对应的语句序列
case case_operand
when when_operand then
statement;
when when_operand then
statement;
....
end case;
case case_operand
when when_operand then
statement;
when when_operand then
statement;
....
end case;
2. 提供多个boolean表达式,然后选择第一个为true的表达式,执行对应的脚本。
case when boolean_expression then
statement;
when boolean_expression then
statement;
...
end case;
case when boolean_expression then
statement;
when boolean_expression then
statement;
...
end case;
对上面的例子进行改进:
declare
c_num number:=1;
begin
case when c_num>0 then
dbms_output.put_line('case:1<0');
end case;
end;
declare
c_num number:=1;
begin
case when c_num>0 then
dbms_output.put_line('case:1<0');
end case;
end;
declare
c_num number:=1;
begin
case c_num
when 0 then
dbms_output.put_line('case:c_num=0');
when 1 then
dbms_output.put_line('case:c_num=1');
when 2 then
dbms_output.put_line('case:c_num=2');
end case;
end;
declare
c_num number:=1;
begin
case c_num
when 0 then
dbms_output.put_line('case:c_num=0');
when 1 then
dbms_output.put_line('case:c_num=1');
when 2 then
dbms_output.put_line('case:c_num=2');
end case;
end;
对比上面的例子,在实际业务中选择合适的条件控制语句。
3. loop循环控制语句
loop语句也叫循环语句,它能让我们重复地执行指定的语句块。loop语句有以下四种形式:
- loop
- while ... loop
- for ... loop
- cursor for loop
3.1 基本的loop
语法格式:
loop
statement ...;--循环语句
exit when ...;--退出条件,循环必须要有退出条件,不然就是死循环。
end loop;
loop
statement ...;--循环语句
exit when ...;--退出条件,循环必须要有退出条件,不然就是死循环。
end loop;
案例: 打印1,2,3,4,5
declare
v_num number:=1;
begin
loop
exit when v_num>5;
dbms_output.put_line('v_num='||v_num);
v_num:=v_num+1;
end loop;
end;
declare
v_num number:=1;
begin
loop
exit when v_num>5;
dbms_output.put_line('v_num='||v_num);
v_num:=v_num+1;
end loop;
end;
另外一种退出循环的方式
declare
v_num number:=1;
begin
<<basic_loop>> --定义标签
loop
if v_num>5 then
exit basic_loop;--退出标签,或者使用goto end_basic_loop;
end if;
dbms_output.put_line('v_num='||v_num);
v_num:=v_num+1;
end loop;
<<end_basic_loop>>
null;--这儿是为了防止goto end_basic_loop;然后直接结束块了,估计是防止goto直接退出块了,所以<<end_basic_loop>>后面要有语句
end;
declare
v_num number:=1;
begin
<<basic_loop>> --定义标签
loop
if v_num>5 then
exit basic_loop;--退出标签,或者使用goto end_basic_loop;
end if;
dbms_output.put_line('v_num='||v_num);
v_num:=v_num+1;
end loop;
<<end_basic_loop>>
null;--这儿是为了防止goto end_basic_loop;然后直接结束块了,估计是防止goto直接退出块了,所以<<end_basic_loop>>后面要有语句
end;
EXIT默认是终止退出当前的循环,但如果使用标签,可以终止并退出指定的loop循环。
null;--这儿是为了防止goto end_basic_loop;然后直接结束块了,估计是防止goto直接退出块了,所以<<end_basic_loop>>后面要有语句
3.2 while ... loop
while ... loop 结构的语句本身可以终止loop循环,当while 后面的布尔表达式为true时,loop和end loop之间为循环体。
把以上案列该成while ... loop
declare
v_num number:=1;
begin
while v_num<=5 loop
dbms_output.put_line('v_num='||v_num);
v_num:=v_num+1;--控制循环条件的,防止死循环
end loop;
end;
declare
v_num number:=1;
begin
while v_num<=5 loop
dbms_output.put_line('v_num='||v_num);
v_num:=v_num+1;--控制循环条件的,防止死循环
end loop;
end;
注意: 自己控制好循环条件,防止死循环.
3.3 for ... loop
for ... loop 语句的语法结构:
<<label_name>>
for index_name in [reverse] lower_bound .. upper_bound loop
statement ...
end loop[label_name];
<<label_name>>
for index_name in [reverse] lower_bound .. upper_bound loop
statement ...
end loop[label_name];
案例1: 求0-20 的整数和
declare
v_num number:=0;
v_sum number(8):=0;
begin
for i in 0 .. 20 loop
v_sum:=v_sum+i;
end loop;
dbms_output.put_line('1-20的整数和为:'||v_sum);
end;
declare
v_num number:=0;
v_sum number(8):=0;
begin
for i in 0 .. 20 loop
v_sum:=v_sum+i;
end loop;
dbms_output.put_line('1-20的整数和为:'||v_sum);
end;
3.4 cursor for loop
在讲游标时,会详细的讲解.......
4. PL/SQL中的DML,DDL和SELECT
在PL/SQL中DML语句可以直接执行,但是DDL语句不能直接执行,需要使用execute immediate 命令执行DDL语句
declare
v_sql varchar2(2000);
begin
v_sql:='create table t_test(id number,name varchar2(50))';
execute immediate v_sql;
end;
declare
v_sql varchar2(2000);
begin
v_sql:='create table t_test(id number,name varchar2(50))';
execute immediate v_sql;
end;
在PL/SQL中不能直接使用select * from table_name;
需要这样 select * into /*存储数据的变量*/ from table_name
这样可能导致两种错误:
no_data_found: 没有数据
too_many_rows:返回多条记录