6.PL/SQL控制结构

1.PL/SQL顺序结构

顺序结构中我们经常使用goto的关键字进行程序的跳转(不在非不得已的情况下,不要使用)

declare
ls_stuinfo stuinfo%rowtype;
xsjbxx varchar2(50);
begin
  select t.* into ls_stuinfo
    from stuinfo t
   where t.stuid='SC201801006'; 
   xsjbxx:='姓名:' ||ls_stuinfo.stuname || ' 学号:' ||ls_stuinfo.stuid || ' 年龄:' ||ls_stuinfo.age;
  dbms_output.put_line(xsjbxx);
  if ls_stuinfo.age>25 then
    goto flag1;
  else
    goto flag2;  
  end if;
  <<flag1>>
  dbms_output.put_line(xsjbxx||' 年龄大于25岁');
  << flag2>>
  null;
exception
  when no_data_found  then
     dbms_output.put_line('该学生在学生信息表中找不到');
end;

2.PL/SQL条件控制

2.1 if-then-end if

语法结构:

if 条件 then
    ---满足条件执行体;
end if;

案例:询学生信息表(stuinfo)中男生的数量

declare
ls_stuinfo stuinfo%rowtype;--学生信息表
ls_number number:=0;--计数器
begin
  --对学生信息表进行全表循环
  for ls_stuinfo in (  select t.* from stuinfo t ) loop
    if ls_stuinfo.sex='1' then--性别编码为1的是男生 
      ls_number:=ls_number+1;--计数器加1
    end if;  
   end loop; 
   dbms_output.put_line('男生的数量是:'||ls_number);
end;

2.2 if-then-else-end if

语法结构:

if 条件 then
    ---满足条件执行体;
else
    ---满足条件执行体;
end if;

案例:分别计算学生信息表中男生和女生的数量各多少

declare
ls_stuinfo stuinfo%rowtype;--学生信息表
ls_number_boy number:=0;--男生计数器
ls_number_girl number:=0;--女生计算器
begin
  --对学生信息表进行全表循环
  for ls_stuinfo in (  select t.* from stuinfo t ) loop
    if ls_stuinfo.sex='1' then--性别编码为1的是男生 
      ls_number_boy:=ls_number_boy+1;--计数器加1
    else
      --性别编码为2(不为1)的是女生  
      ls_number_girl:=ls_number_girl+1;--计数器加1
    end if;  
   end loop; 
   dbms_output.put_line('男生的数量是:'||ls_number_boy||',女生的数量是:'|| ls_number_girl);
end;

2.3 if-then-elsif-then-end if

语法结构:

if 条件1 then
    --条件1成立执行体;
elsif 条件2 then
    ---条件1不成立,条件而成立执行体;
else
    ---条件都不成立执行体;
end if;

2.4 case...when...then

CASE 是一种选择结构的控制语句,可以根据条件从多个执行分支中选择相应的执行动作。也可以作为表达式使用,返回一个值。
语法结构

CASE 选择体 
     WHEN 表达式1 then 执行体;
     WHEN 表达式2 then 执行体;
     WHEN 表达式3 then 执行体;
     ...
     ELSE 表达式n  then 执行体;
END CASE;

语法解析
如果存在选择体,选择体 与 WHEN 后面的表达式匹配,匹配成功就执行 THEN 后面的语句。如果所有表达式都与选择体不匹配,则执行 ELSE 后面的语句。
案例:通过选择体CASE WHEN 区分出学生信息表中学生的各个年龄的人数。代码如下:

declare
ls_stuinfo stuinfo%rowtype;--学生信息表
ls_number_26 number:=0;--26岁计数器
ls_number_27 number:=0;--27岁计数器
ls_number number:=0;--其它
begin
  --对学生信息表进行全表循环
  for ls_stuinfo in (  select t.* from stuinfo t ) loop
    case ls_stuinfo.age
      when 26 then 
        ls_number_26:=ls_number_26+1;
      when 27 then 
        ls_number_27:=ls_number_27+1;
      else 
        ls_number:=  ls_number+1;
    end case;     
  end loop;
  dbms_output.put_line('26岁:'||ls_number_26||'人,27岁:'||ls_number_27||'人,其它岁数:'||ls_number||'人');
end;

3.PL/SQL循环结构

3.1 for 循环

语法结构

--通过循环体直接进行loop循环
for 循环体别名 in (SELECT 条件查询数据) loop
    --循环执行体;
end loop;

--通过循环变量进行循环
for 循环变量 in 循环下限...循环上限 loop
end loop;

案例:通过循环体直接LOOP循环参考案例1中的对表循环,我们通过第二种方式调整案例1的代码

declare
type stuinfo_type is table of  stuinfo%rowtype;--学生信息表
ls_stuinfo stuinfo_type;--声明一个集合变量(学生集合变量)
ls_number number:=0;--计数器
begin
  --赋值给学生集合变量
  select * BULK COLLECT into ls_stuinfo from stuinfo;
  --对集合变量进行for循环,通过下标取值 
  for i in 1.. ls_stuinfo.count loop
    if ls_stuinfo(i).sex='1' then--性别编码为1的是男生 
      ls_number:=ls_number+1;--计数器加1
    end if;  
   end loop; 
   dbms_output.put_line('男生的数量是:'||ls_number);
end;

3.2 while循环

语法结构

while 条件 loop
    ---循环执行体
end loop;

案例:一个简单1加到n(n=4)的代码的while循环代码

declare
ls_number number:=0;--结果值
i number:=1;--计数器
begin
while i<=4 loop
   ls_number:=ls_number+i;
   i:=i+1;
end loop;
dbms_output.put_line(ls_number);  
end;
posted @ 2022-12-15 17:15  种太阳  阅读(29)  评论(0编辑  收藏  举报