一、游标的定义和使用

1.声明游标

DECLARE  游标名 CURSOR  FOR  SELECT语句;

2.打开游标

OPEN   游标名;

3.提取数据

FETCH  游标名  INTO   变量名1[,变量名2……];

4.关闭游标

CLOSE  游标名;

【例3-43】创建存储过程emp_p,用游标提取emp表中1006雇员的姓名和职务。

DELIMITER @@
DROP PROCEDURE IF EXISTS emp_p@@
CREATE PROCEDURE emp_p()#创建无参的存储过程BEGINDECLARE v_ename VARCHAR(255); #长度最好与表中定义的保持一致DECLARE v_job   VARCHAR(255); #声明变量  DECLARE emp_cursor CURSOR     FOR  SELECT  ename,Job  FROM emp   WHERE  empno=1006;OPEN emp_cursor;#打开游标          FETCH emp_cursor INTO v_ename,v_job;#从游标获取信息保存到变量 CLOSE emp_cursor; #关闭游标              SELECT v_ename,v_job;#查看从游标读取的数据END@@
DELIMITER ;
CALL emp_p();#调用游标

【例3-44】创建存储过程emp_p1,用游标显示工资最高的前3名雇员的姓名和工资。

DELIMITER @@
CREATE PROCEDURE emp_p1()#创建无参数存储过程BEGINDECLARE v_ename VARCHAR(14);#声明变量DECLARE v_sal   DECIMAL(7,2);DECLARE i INT;DECLARE mycursor CURSOR FOR  SELECT  ename,sal  FROM emp  ORDER BY sal DESCLIMIT  3; SET i=1;#声明变量CREATE TABLE result(#创建一张表,用来存储员工姓名和工资ename VARCHAR(14),sal   DECIMAL(7,2));
OPEN mycursor;#打开游标WHILE i<=3 DOFETCH mycursor INTO v_ename,v_sal;#从游标提取出一条数据,存储在相应变量内INSERT INTO result VALUES(v_ename,v_sal);#把从游标内取出的数据插入创建的表result,该语句执行一次插入一条数据SET i=i+1;END WHILE;CLOSE mycursor;#关闭游标SELECT * FROM result;#查询新表END@@DELIMITER ;
CALL emp_p1();  

使用示例: 返回用户的最近一次充值记录(返回最后一条)

DELIMITER @@
DROP PROCEDURE IF EXISTS findcharge_log@@
CREATE PROCEDURE findcharge_log(
IN cusid INT
)#创建有参的存储过程BEGINDECLARE v_who int(10); #长度最好与表中定义的保持一致DECLARE v_money double(20,2); #声明变量  DECLARE v_date datetime; #声明变量-- 遍历数据结束标志DECLARE done INT DEFAULT FALSE;-- 游标DECLARE charge_cursor CURSOR FOR SELECT who,money,oper_date FROM charge_log where who=cusid AND IFNULL(money,0);-- 将结束标志绑定到游标DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;OPEN charge_cursor;#打开游标-- 遍历read_loop: LOOP -- 删除消费记录或者更改其他信息的记录DELETE FROM charge_log WHERE money=0 or money<0; FETCH NEXT FROM charge_cursor INTO v_who,v_money,v_date;#从游标获取信息保存到变量 IF done THENLEAVE read_loop;END IF; END LOOP;CLOSE charge_cursor; #关闭游标SELECT v_who,v_money,v_date;#查看从游标读取的数据END@@
DELIMITER ;

在java中调用:

public Charge findChargeByid(int id) {Connection conn = null; // 数据库连接对象CallableStatement clbStmt = null; // CallableStatement对象ResultSet rs = null; // 结果集对象Charge charge=new Charge();try {// 获取数据库连接conn = JdbcUtils.getConnection();// 创建CallableStatement对象,调用存储函数clbStmt = conn.prepareCall("{CALL findcharge_log(?)}");// 获取顾客id参数clbStmt.setInt(1, id); // 执行调用存储过程,并获取结果集rs = clbStmt.executeQuery();if(rs.next()) {//读取游标返回的结果charge.setId(rs.getInt("v_who"));charge.setMoney(rs.getDouble("v_money"));charge.setCdate(rs.getString("v_date"));}} catch (SQLException sqle) {sqle.printStackTrace();} finally {// 关闭数据库操作对象try {rs.close();JdbcUtils.closeDB(conn, clbStmt);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return charge;}

数据库游标以及在java中的应用相关推荐

  1. oracle时间类型转化成java对象_Oracle数据库date类型与Java中Date的联系与转化

    以下是对Java中的日期对象与Oracle中的日期之间的区别与联系做点说明,以期对大家有所帮助. new Date():分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒),就是系统当 ...

  2. java异步调用数据库存储过程详解,java中如何调用存储过程

    create procedure getsum @n int =0 as declare @sum int declare @i int set @sum=0 set @i=0 while @i 在线 ...

  3. java jexl_利用Jexl实现数据库的计算公式在Java中执行

    public class JexlEngineUtils { public static BigDecimal evaluateExpression ( Map map, String[] eleme ...

  4. DB2数据库游标使用总结

    DB2数据库游标使用总结      工作中因需要使用DB2,所以逼迫自己学习db2游标的使用,上网看了很多材料,加上自己的一些总结,把最近的学习心得总结以下,希望对工作中使用DB2数据库的同学能有所帮 ...

  5. java rowset,cachedrowset 如何使用Java中的RowSet

    调用CachedRowSetImpl类时,为什么会出现这种错误有些人就是这样,哪怕只见过一次,终生都无法忘怀. Access restriction: The type CachedRowSetImp ...

  6. Java中的数据库架构导航

    jOOQ的重要组成部分是数据库架构导航模块jooq-meta. 代码生成器使用它来发现相关的架构对象. 我多次被问到为什么我要自己滚动而不使用其他库,例如SchemaCrawler或SchemaSpy ...

  7. 嵌入式数据库在Java中的应用

    嵌入式数据库无需安装,体积小巧,速度又很快,在很多场合可以替代目前流行的MySQL, SQLServer等大中型数据库.本文介绍两种嵌入式数据库产品:Berkeley DB和SQLite,并着重讨论它 ...

  8. Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php  c#.Net...

    Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php  c#.Net 1. -catalog与schema的设计区别1 ...

  9. java代码连接oracle数据库连接_在JAVA中连接Oracle数据库(例子)

    * TODO 要更改此生成的文件的模板,请转至 * 窗口 - 首选项 - java - 代码样式 - 代码模板 */ package person.fane.test; import java.sql ...

最新文章

  1. idea install 失败_idea maven install 卡住,无报错排查。
  2. 09_ServletContext介绍
  3. mysql 避免重复添加_MySql三种避免重复插入数据的方法
  4. 理想传输线终端短路开路和接纯电抗的沿线电压电流分布
  5. python中tkinter模块pack_使用Python中的tkinter模块作图的方法
  6. VS2015编译VS2013工程文件出错
  7. 数据包络分析方法与maxdea软件_数据包络模型 DEA三阶段超效率SBM非期望
  8. 数学建模算法与应用(目录)
  9. 单片机原理及应用 C51编程 proteus仿真
  10. oracle yyyymmdd 年末,oracle中日期格式'yyyy-mm-dd'和'yyyymmdd'的区别
  11. win10产品密钥查看
  12. CKEditor/FCKEditor 使用-CKEditor(FCKeditor)精简版大全
  13. rap技术原理_人们对Rap(说唱)理解的误区,你知道多少?
  14. 工作中遇到的遇到的问题总结20160307
  15. KL散度,互信息和JSD
  16. 优雅简洁的通用排版利器:MarkDown(支持公众号、知乎等场景渲染)
  17. adobe captivate 5.5 中文教程
  18. qt :C4819 著名错误
  19. NeuralCD--智能教育系统中的神经认知诊断
  20. mysql的自身防御不包括_2020高校邦《MySQL数据库基础》作业题库2020智慧树《大学物理 Ⅰ》判断题答案...

热门文章

  1. Vue中通过配置eslintrc.js文件来解决编译时出现的no-trailing-spaces、no-undef等错误
  2. mapreduce官方文档中文版
  3. 阿里巴巴创始十八罗汉的前世今生
  4. 客快物流大数据项目(六十五):仓库主题
  5. 网站建设的基本流程是怎样的?
  6. 2022年【电商】测试优惠券如何编写测试用例?
  7. Win10配置Outlook的163邮箱客户端
  8. php 定义变量为什么前面加一个美元($)符号呢
  9. trans-resistor(转换电阻),后来缩写为transistor,中文译名就是晶体管。trans词根.变形金刚,变压器都是transformers
  10. 【23年2月23日更新】搭建宝塔面板、青龙面板“京东代挂”