存储过程游标遍历

源自 http://375940084.blog.51cto.com/2581965/1060822/ 棉花糖的博客

 1 CREATE OR REPLACE PROCEDURE PRC_LJ IS
 2   CURSOR C_EMP IS --声明显式游标
 3     SELECT EMPNO,ENAME FROM EMP;
 4   C_ROW C_EMP%ROWTYPE; --定义游标变量,该变量的类型为基于游标C_EMP的记录
 5 BEGIN
 6   --For 循环
 7   FOR C_ROW IN C_EMP LOOP
 8     DBMS_OUTPUT.PUT_LINE(C_ROW.EMPNO || ‘--‘ || C_ROW.ENAME);
 9   END LOOP;
10
11   --Fetch 循环
12   OPEN C_EMP;--必须要明确的打开和关闭游标
13   LOOP
14     FETCH C_EMP
15       INTO C_ROW;
16     EXIT WHEN C_EMP%NOTFOUND;
17     DBMS_OUTPUT.PUT_LINE(C_ROW.EMPNO || ‘++‘ || C_ROW.ENAME);
18   END LOOP;
19   CLOSE C_EMP;
20
21   --While 循环
22   OPEN C_EMP;--必须要明确的打开和关闭游标
23     FETCH C_EMP INTO C_ROW;
24     WHILE C_EMP%FOUND LOOP
25       DBMS_OUTPUT.PUT_LINE(C_ROW.EMPNO || ‘**‘ || C_ROW.ENAME);
26       FETCH C_EMP INTO C_ROW;
27     END LOOP;
28   CLOSE C_EMP;
29 END PRC_LJ;

第一种使用For 循环
for循环是比较简单实用的方法。 
首先,它会自动open和close游标。解决了你忘记打开或关闭游标的烦恼。 
其次,自动声明一个记录类型及定义该类型的变量,并自动fetch数据到这个变量。 
注意C_ROW 这个变量无需要在循环外进行声明,无需为其指定数据类型。它是一个记录类型,具体的结构是由游标决定的。
这个变量的作用域仅仅是在循环体内。
最后,与该游标关联的所有记录都已经被取回后,循环无条件结束,不必判定游标的%NOTFOUND属性为TRUE。
for循环是用来循环游标的最好方法。高效,简洁,安全。

第二种使用Fetch循环
注意,exit when语句一定要紧跟在fetch之后,避免多余的数据处理。 
处理逻辑需要跟在exit when之后。 
循环结束后要记得关闭游标。

第三种使用While循环
使用while 循环时,需要在循环之前进行一次fetch动作,游标的属性才会起作用。
而且数据处理动作必须放在循环体内的fetch方法之前,循环体内的fetch方法要放在最后,否则就会多处理一次。

时间: 2024-08-01 22:39:43

存储过程游标遍历的相关文章

ORACLE 11G在存储过程里面遍历游标, 调用job任务定时执行

ORACLE存储过程里游标遍历.调用job定时执行 1,第一种使用For 循环 for循环是比较简单实用的方法. 首先,它会自动open和close游标.解决了你忘记打开或关闭游标的烦恼. 其次,自动声明一个记录类型及定义该类型的变量,并自动fetch数据到这个变量. 注意C_ROW 这个变量无需要在循环外进行声明,无需为其指定数据类型.它是一个记录类型,具体的结构是由游标决定的. 这个变量的作用域仅仅是在循环体内. 最后,与该游标关联的所有记录都已经被取回后,循环无条件结束,不必判定游标的%N

mysql存储过程之游标遍历数据表

原文:mysql存储过程之游标遍历数据表 今天写一个mysql存储过程,根据自己的需求要遍历一个数据表,因为对存储过程用的不多,语法不甚熟悉,加之存储过程没有调试环境,花了不少时间才慢慢弄好,故留个痕迹. 1 BEGIN 2 DECLARE Done INT DEFAULT 0; 3 4 DECLARE CurrentLingQi INT; 5 6 DECLARE ShizuName VARCHAR(30); 7 /* 声明游标 */ 8 DECLARE rs CURSOR FOR SELECT

ORACLE 11G在存储过程里面遍历游标, 调用job任务定时运行

ORACLE存储过程里游标遍历.调用job定时运行 1,第一种使用For 循环 for循环是比較简单有用的方法. 首先.它会自己主动open和close游标.攻克了你忘记打开或关闭游标的烦恼. 其次,自己主动声明一个记录类型及定义该类型的变量,并自己主动fetch数据到这个变量. 注意C_ROW 这个变量无需要在循环外进行声明,无需为其指定数据类型.它是一个记录类型,详细的结构是由游标决定的. 这个变量的作用域不过在循环体内. 最后,与该游标关联的全部记录都已经被取回后.循环无条件结束,不必判定

mysql之——存储过程 + 游标 + 事务

下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考. 其中,涉及到了存储过程.游标(双层循环).事务. [说明]:代码中的注释只针对当时业务而言,无须理会. 代码如下: DELIMITER $$ DROP PROCEDURE IF EXISTS `transferEmailTempData`$$ CREATE PROCEDURE transferEmailTempData(IN jobId VARCHAR(24)) BEGIN DECLARE idval VARCH

存储过程调用 遍历返回结果集

//java调用存储过程 使用游标遍历结果集 public void getCallableStatement(){ CallableStatement cs=null; Connection conn=this.getConnection(); //存储过程 用户名.procedure String procedure="{call emp_pkg.pro_read(?,?)}"; try { cs=conn.prepareCall(procedure); cs.setInt(1,

杏彩平台出租mysql存储过程之遍历多表记录后插入第三方表中

自从学过存储过程后杏彩平台出租(www.1159880099.com )QQ1159880099,就再也没有碰过存储过程,这是毕业后写的第一个存储过程. 因为项目里设备的种类比较多,分别存在不同的数据表中,java中对应不同的java bean对象,想要统一管理有点困难.最近正好要开发一个功能模块,就是需要统一对设备进行处理,想着为了以后都能方便的统一处理各种设备,就从现在开始设计一套方案管理起这些项目吧. 如何统一管理呢? 如果从项目一开始设计的时候就能考虑到项目会发展成今天这样,当初就应该抽

一次使用存储过程游标遇到的坑

一次使用存储过程游标遇到的坑 有这样一个需求:统计某省某市某区前6个月的数据,直接sql查询效率很低,于是打算做定时任务,用定时器执行存储过程的方式在每月初统计上月的相关数据. 使用存储过程就要用到游标了,之前很少写存储过程,对游标也不是熟悉,咋办呢,现学现用啦. 创建存储过程 1 CREATE 2 [DEFINER = { user | CURRENT_USER }] 3 PROCEDURE sp_name ([proc_parameter[,...]]) 4 [characteristic

存储过程 游标

CREATE PROCEDURE [dbo].[RuleExecute_Temp] AS declare @executedate varchar(20) declare @branchcode varchar(50) declare @rulenumber varchar(50) declare @number varchar(20) declare @JLWZCode varchar(20) declare cur cursor for SELECT ExcuteDate,RuleNumbe

学习日志---非递归二叉树游标遍历(前中后层序)

实现: //二叉树类 public class MyBiTree { private MyBiTreeNode  root;//根节点 MyBiTree() { this.root = null; } MyBiTree(Object data,MyBiTree left,MyBiTree right) { MyBiTreeNode l,r; if(left==null) { l = null; } else {    l=left.root;  } if(right==null) { r = n