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;
复制
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;
复制
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;
复制
注意: &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;
复制
2. 提供多个boolean表达式,然后选择第一个为true的表达式,执行对应的脚本。
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 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;
复制
案例: 打印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 <<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;
复制
注意: 自己控制好循环条件,防止死循环.
3.3 for ... loop
for ... loop 语句的语法结构:
<<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;
复制
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;
复制
在PL/SQL中不能直接使用select * from table_name;
需要这样 select * into /*存储数据的变量*/ from table_name
这样可能导致两种错误:
no_data_found: 没有数据
too_many_rows:返回多条记录