【PL/SQL】游标提取循环

注意exit when mycur%notfound; 放置的位置不同,输出结果也不同。
第一个例子中循环在 it is over 提示后,又重复输出了  owner is  SYS,vid is 3;这是因为当提取到游标结果集的最后一行之后,不再提取其他的行。所以变量 vid ,vowner 不会被改变,当再次输出这些变量的语句时,就会重复输出了
declare
  vid t.object_id%type;
  vowner t.owner%type;
  vnum integer;
  cursor  mycur is select object_id ,owner from t where rownum <7;
 begin
  -- select object_id ,owner into vid,vowner from t where rownum =2;
  open mycur;
   loop
      fetch mycur into vid,vowner;
      if vnum = 6 then
         dbms_output.put_line('it is over');
         vnum :=vnum+1;
         end if;
         vnum :=mycur%rowcount;
      dbms_output.put_line(vnum||' owner is  '||vowner||','||'vid is '||vid);
   if mycur%notfound then
     dbms_output.put_line('there is no data finded!');
   end if;
    exit when mycur%notfound;  
   end loop;
 close mycur;
 end;
 
 输出为:
owner is  SYS,vid is 1
owner is  SYS,vid is 46
owner is  SYS,vid is 28
owner is  SYS,vid is 15
owner is  SYS,vid is 29
owner is  SYS,vid is 3
it is over
owner is  SYS,vid is 3
there is no data finded!
======================================================================
此例子与上一例子的区别是 exit when 语句的位置。放在了fetch 之后。
结果集被取出完毕之后,便退出loop。下面的语句不再执行。
declare
  vid t.object_id%type;
  vowner t.owner%type;
  vnum integer;
  cursor  mycur is select object_id ,owner from t where rownum <7;
 begin
  -- select object_id ,owner into vid,vowner from t where rownum =2;
  open mycur;
   loop
      fetch mycur into vid,vowner;  
      exit when mycur%notfound; 
      if vnum = 6 then
         dbms_output.put_line('it is over');
         vnum :=vnum+1;
         end if;
         vnum :=mycur%rowcount;
      dbms_output.put_line(vnum||'owner is  '||vowner||','||'vid is '||vid);
   if mycur%notfound then
     dbms_output.put_line('there is no data finded!');
   end if;
   end loop;
 close mycur;
 end;
 输出为:
1 owner is  SYS,vid is 1
2 owner is  SYS,vid is 46
3 owner is  SYS,vid is 28
4 owner is  SYS,vid is 15
5 owner is  SYS,vid is 29
6 owner is  SYS,vid is 3

时间: 2024-08-01 10:59:04

【PL/SQL】游标提取循环的相关文章

PL/SQL 游标变量

    游标变量与游标相似,有其共性,也有其不同点.就其共性来说两者都是指向多行查询的结果集中的当前行.都要经历声明,打开,检索与关闭的过程.所不同的是游标与游标变量类似于常量与变量.游标是静态的,而游标变量是动态的,因为游标变量并不与某个特定的查询相绑定.所以,游标变量可以打开任何类型兼容的查询.其次可以将游标变量作为参数传递给本地和存储子程序.本文主要描述游标变量的使用.   一.什么是游标变量    显示游标用于命名一个工作区域,其中保存多行查询的信息,而且该游标始终指向工作区域的内容.而

sql游标中循环使用方法

sql游标中循环使用方法 mysql教程> mysql> CREATE TABLE Employee(     ->     id            int,     ->     first_name    VARCHAR(15),     ->     last_name     VARCHAR(15),     ->     start_date    DATE,     ->     end_date      DATE,     ->    

PL/SQL游标(原创)

游标的相关概念及特性定义映射在结果集中某一行数据的具体位置,类似于C语言中的指针.即通过游标方式定位到结果集中某个特定的行,然后根据业务需求对该行进行相应特定的操作.游标的分类显示游标:即用户自定义游标,专门用于处理select语句返回的多行数据隐式游标:系统自动定义的游标,记录集只有单行数据,用于处理select into 和DML语句游标使用的一般过程:显示游标:声明, 打开, 读取, 关闭隐式游标:直接使用读取,声明.打开.关闭都是系统自动进行的显示游标的过程描述a.声明游标CURSOR

Oracle数据库之PL/SQL游标学习笔记

1. 游标概念 字面意思是游动的光标,是指向上下文区域的句柄或指针. 在PL/SQL块中执行CRUD操作时,ORACLE会在内存中为其分配上下文区.用数据库语言来描述游标就是:映射在上下文区结果集中一行数据上的位置实体. 用户可以使用游标访问结果集中的任意一行数据,将游标指向某行后,即可对该行数据进行操作.游标为应用提供了一种对具有多行数据查询结果集中的每一行数据分别进行单独处理的方法,是设计嵌入式SQL语句的应用程序的常用编程方式. 在每个用户会话中,可以同时打开多个游标,其最大数量由数据库初

PL/SQL --&amp;gt; 游标

--================== -- PL/SQL --> 游标 --==================   一.游标的相关概念及特性     1.定义         映射在结果集中某一行数据的具体位置,类似于C语言中的指针.即通过游标方式定位到结果集中某个特定的行,然后根据业务需求         对该行进行相应特定的操作.             2.游标的分类         显示游标:即用户自定义游标,专门用于处理select语句返回的多行数据         隐式游标:系

PL/SQL --&amp;gt;隐式游标(SQL%FOUND)

--=============================== -- PL/SQL -->隐式游标(SQL%FOUND) --===============================       在PL/SQL中,游标的使用分为两种,一种是显示游标,一种是隐式游标,显示游标的使用需要事先使用declare来进行声明,其过程包括 声明游标,打开游标,从游标提取数据,关闭游标.该方式多用于处理select语句返回的多行数据的情形.而隐式游标则由则由系统自动定义 ,当DML被使用时,Orac

pl/sql-关于PL/SQL的有关loop循环的问题

问题描述 关于PL/SQL的有关loop循环的问题 本人是学习PL/SQL的小菜鸟,最近遇到一个问题解决不了,还希望各位高手指点一二. 下面是一个关于cursor的语句,但是其中的cursor c3怎么都不进去,而且确定cursor c3是有值的,是应该要用into替换as吗?可是cursorc1 c2都可以进,该声明和定义的都已经做了 CURSOR c1 IS SELECT RPAD ('LCM_CELL', 20, ' ') format_id, RPAD (' ', 20, ' ') tr

PL/SQL --&amp;gt; 动态SQL

--==================== -- PL/SQL --> 动态SQL --====================         使用动态SQL是在编写PL/SQL过程时经常使用的方法之一.很多情况下,比如根据业务的需要,如果输入不同查询条件,则生成不同的执行 SQL查询语句,对于这种情况需要使用动态SQL来完成.再比如,对于分页的情况,对于不同的表,必定存在不同的字段,因此使用静态SQL则只 能针对某几个特定的表来形成分页.而使用动态的SQL,则可以对不同的表,不同的字段进行

PL/SQL --&amp;gt; 包重载、初始化

--========================== -- PL/SQL --> 包重载.初始化 --==========================       包的重载功能类似于C++中函数的重载功能,即拥有多个同名的子程序,每个同名子程序使用不同的参数.用户可以传递不同的参数来调 用同名但参数不同的子程序,此即为包的重载功能.简言之,不管传递什么样的参数,所完成的任务是相同的.假定需要查询部门所在的位置 ,输入参数部门编号或部门名称都会返回同样的结果.对外部程序而言,似乎是调用的同