首页 > 数据库 >6.PL/SQL控制结构

6.PL/SQL控制结构

时间:2022-12-15 17:24:44浏览次数:37  
标签:end loop -- number 控制结构 ls SQL PL stuinfo

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;

标签:end,loop,--,number,控制结构,ls,SQL,PL,stuinfo
From: https://www.cnblogs.com/mxx520/p/16985584.html

相关文章

  • 7.PL/SQL动态执行DDL语句
    1.语法EXECUTEIMMEDIATE动态SQL语句[into变量列表][using参数列表]语法解析:如果动态SQL语句是SELECT语句,可以把查询的结果保存到INTO后面的变量中。如果......
  • 8.PL/SQL异常处理
    语法结构declare--声明部分begin--执行部分exception--异常部分whenexception1then--异常1处理程序[whenexception2then--异常2处理程序][whenother......
  • 盘点现在用的SqlServer 5种分页方式和拉姆达表达式分页,进来看看吧。
    现在基本上大家都在使用各种轮子自带的分页,大家是否还记得sql分页怎么写?今天我们就来盘一盘怎么写和用哪种方式写。欢迎大家评论区讨论。1、ROW_NUMBER()OVER()方式(SQL......
  • k8s创建MySQL
    Kubernetes创建MysQL整体流程:创建数据存储PV、PVC;创建MySQL数据库、创建访问入口Service;导入测试数据库test-db创建数据存储PV、PVC这里我们使用nfs作为storageclass......
  • 嵌入式数据库 sqllite & h2  utils
    使用场景:简单脚本,但是有需要数据记录.(使用前升级下版本)     我的使用:老机器,老项目,jkd6, 需要记录 SqlLiteUtilspackagecom.icil.edi.listener......
  • ORM执行SQL 双下划线查询 ORM外键字段创建 外键字段相关操作 ORM跨表查询 跨表查询进
    目录ORM执行SQL语句方式1:使用pymysql模块方式2:使用raw方法方式3:djangoconnection双下划线查询__gt(>)__lt(<)queryset对象特性__gte(≥)__lte(≤)__in__range__cont......
  • SQL的使用总结
    select*fromempselect*fromdeptselect*fromjobselect*fromsalarygrade--1.查询所有员工信息。查询员工编号,员工姓名,工资,职务名称,职务描述SELECT t1......
  • JavaconfigApplicationTests
    packagecom.example.demo;importcom.example.demo.config.JavaConfig;importcom.example.demo.model.Printer;importorg.junit.Test;importorg.junit.runner.Ru......
  • vite plugin
    //自定义插件./plugins/fullImportPluginimport*aspathfrom'path'importtype{Plugin,ResolvedConfig}from'vite'exportdefaultfunctionfullImportPl......
  • MySQL数据管理
    MySQL数据管理1.外键(了解)在创建表的时候,增加约束CREATETABLE`grade`( `gradeid`INT(10)NOTNULLAUTO_INCREMENTCOMMENT'年级id', `gradename`VARCHAR(50)N......