视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Oracle游标—for、loop、if结合应用
2020-11-09 14:57:20 责编:小采
文档

什么时候会用到Oracle游标,以及其中的for、loop、if呢?

一、需求

什么时候会用到Oracle游标,以及其中的for、loop、if呢?

先看这样一个需求:

有一张学生授课表T_TEACHING,每个学生都有数门课程:

但是因为某些原因,导致有的学生课程不全(本应该每个学生都有3门课),应该如何把不全的学生检索出来,再给这些学生添加课程呢,并且要求能够快速解决这个问题。

二、分析

我们对需求进行一步步梳理:

1、我们不知道哪个学生课程不全,所以需要循环判断每个学生

通常用for循环:for USER_ID in USER_IDS

2、循环判断每个学生就要拿到所有的学号

select:select USER_ID from T_TEACHING GROUP BY USER_ID;

3、有了学号,判断这个学生是否缺少课程,然后添加这门课

(1)select:select count(*) from T_TEACHING where USER_ID=@USER_ID and COURSE_ID=@COURSE_ID;

(2)if else 判断

(3)insert:insert into T_TEACHING(COURSE_ID,USER_ID) values (@COURSE_ID,@USER_ID)

通过分析大致的流程出来了,然后再看细节:

我们通过select ..GROUP BY获取了授课表中所有的学号,然后就对这些学号进行循环获取,,关键在于select ..GROUP BY出来如何循环获取。

三、方法

在oracle中提供了“游标”

游标是什么,游标用来处理从数据库中检索的多行记录(使用SELECT语句)。利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集。

这正是我们想要的!!

结合for循环,我们可以使用for循环游标,格式如下:

--(1)定义游标
--关键字cursor
cursor x is select语句

--(2)定义游标变量
  y x%rowtype

--(3)使用for循环来使用这个游标
for y in x loop

--逻辑处理

end loop;

下面我们通过sql存储过程来完整的实现上面的需求

declare
--定义类型
cursor t_tea
is
select USER_ID from T_TEACHING GROUP BY USER_ID;
--定义一个游标变量
t_row t_tea%rowtype;
--定义一个number类型的临时变量
    v_count number;
begin
for t_row in t_tea loop
    select count(*) into v_count from T_TEACHING where USER_ID=t_row.USER_ID and COURSE_ID=02;
     if v_count = 0 then
       insert into T_TEACHING(COURSE_ID,USER_ID) values (02,t_row.USER_ID);
     end if;
end loop;
end;

四、总结  

Oracle中的游标循环不只有for循环,Oracle中提供了两种游标,显示游标和隐式游标,其他游标的使用方式可以在这里了解,用到了在深入研究:

下载本文
显示全文
专题