Mysql存储过程中使用cursor

一、表
学生表
CREATE TABLE `t_student` (
   `stuNum` int(11) NOT NULL auto_increment,
   `stuName` varchar(20) default NULL,
   `birthday` date default NULL,
   PRIMARY KEY  (`stuNum`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

学生分数表
CREATE TABLE `t_stu_score` (
   `id` int(11) NOT NULL auto_increment,
   `stuNum` int(11) default NULL,
   `score` decimal(6,2) default NULL,
   PRIMARY KEY  (`id`),
   KEY `FK_t_stu_score` (`stuNum`),
   CONSTRAINT `FK_t_stu_score` FOREIGN KEY (`stuNum`) REFERENCES `t_student` (`stuNum`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

学生详细表
CREATE TABLE `t_stu_detail` (
   `id` int(11) NOT NULL auto_increment,
   `stuName` varchar(20) default NULL,
   `score` decimal(6,2) default NULL,
   PRIMARY KEY  (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

将t_Student和t_stu_score表中满足一定条件的数据插入到t_stu_detail中。

二、过程
DELIMITER &&
 CREATE PROCEDURE proc_AddStuDetail( IN p_score DECIMAL(6,2) )
  BEGIN
DECLARE vstuNum INT;
DECLARE vstuName VARCHAR(20);
DECLARE vbirthday DATE;
DECLARE vscore DECIMAL(6,2);
DECLARE done INT;

-- 定义游标
DECLARE stuCursor CURSOR
FOR
SELECT stuNum,stuName,birthday FROM t_Student;

-- 定义结束标记
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

-- 打开游标
OPEN stuCursor;

-- 循环
stuLoop:LOOP
-- 取游标中的数据
FETCH stuCursor INTO vstuNum,vstuName,vbirthday;
IF done = 1 THEN
LEAVE stuLoop;
END IF;

IF DATE(vbirthday) >= '1990-03-01' THEN
SELECT score INTO vscore FROM t_stu_score WHERE stuNum = vstuNum;
IF vscore >= p_score THEN
INSERT INTO t_stu_detail VALUES(NULL,vstuNum,vscore);
END IF;

END IF;
END LOOP stuLoop;

-- 关闭游标
CLOSE stuCursor;
  END
&&
DELIMITER ;

三、调用过程
CALL proc_AddStuDetail(86);

时间: 2024-09-15 06:18:34

Mysql存储过程中使用cursor的相关文章

mysql 存储过程中游标临时表问题

问题描述 mysql 存储过程中游标临时表问题 DELIMITER $$ USE laolao$$ DROP PROCEDURE IF EXISTS parent_sport_sort1$$ CREATE DEFINER=root@% PROCEDURE parent_sport_sort1(IN jidb VARCHAR(64),IN uname VARCHAR(64),IN starttime VARCHAR(64),IN endtime VARCHAR(64), IN startmonth

mysql 存储过程中使用了游标和临时表,返回的临时表数据不准确

问题描述 mysql 存储过程中使用了游标和临时表,返回的临时表数据不准确 DELIMITER $$ USE laolao$$ DROP PROCEDURE IF EXISTS parent_sport_sort1$$ CREATE DEFINER=root@% PROCEDURE parent_sport_sort1(IN jidb VARCHAR(64),IN uname VARCHAR(64),IN starttime VARCHAR(64),IN endtime VARCHAR(64),

mysql 存储过程中游标与多游标实例

例  代码如下 复制代码 DELIMITER $$ DROP PROCEDURE IF EXISTS getUserInfo $$ CREATE PROCEDURE getUserInfo(in date_day datetime) -- -- 实例 -- MYSQL存储过程名为:getUserInfo -- 参数为:date_day日期格式:2008-03-08 --     BEGIN declare _userName varchar(12); -- 用户名 declare _chines

mysql存储过程中变量的定义赋值操作

昨天我们讲了mysql教程存储过程创建修改与删除,下面我们这篇教程是讲关于mysql存储过程中变量的定义赋值操作哦. 一.变量的定义 定义一个变量语法如下: declare var_name[,...] type[default value] 看一个变量定义实例 declare last date; 二.mysql存储过程变量赋值 变量的赋值可直接赋值与查询赋值来操作,直接赋值可以用set来操作,可以是常量或表达式如果下 set var_name= [,var_name expr]... 给上面

mysql存储过程中动态表名的使用

问题描述 mysql存储过程中动态表名的使用 BEGIN if tablename is not null then declare v_sql varchar(500); set v_sql = concat('select WXPayBillID,WXPayMoney FROM ',tablename); select v_sql; set @v_sql=v_sql;///这里写的有问题? prepare stmt from @v_sql; EXECUTE stmt; deallocate

MySQL存储过程中实现执行动态SQL语句的方法_Mysql

本文实例讲述了MySQL存储过程中实现执行动态SQL语句的方法.分享给大家供大家参考.具体实现方法如下: mysql> mysql> delimiter $$ mysql> mysql> CREATE PROCEDURE set_col_value -> (in_table VARCHAR(128), -> in_column VARCHAR(128), -> in_new_value VARCHAR(1000), -> in_where VARCHAR(4

MySQL存储过程中的事务管理实例说明

mysql存储过程中事务SQL代码  delimiter $$  use test$$  create procedure t_insert_table()  begin      /** 标记是否出错 */      declare t_error int default 0;      /** 如果出现sql异常,则将t_error设置为1后继续执行后面的操作 */      declare continue handler for sqlexception set t_error=1; -

浅谈MySQL存储过程中declare和set定义变量的区别_Mysql

在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅在类中生效.即只在存储过程中的begin和end之间生效. 2.@set定义的变量,叫做会话变量,也叫用户定义变量,在整个会话中都起作用(比如某个应用的一个连接过程中),即这个变量可以在被调用的存储过程或者代码之间共享数据.如何理解呢?可以看下面这个简单例子,很好理解.  (1)先执行下面脚本,创建

mysql存储过程中的异常处理

定义异常捕获类型及处理方法:     DECLARE handler_action HANDLER          FOR condition_value [, condition_value] ...          statement            handler_action:          CONTINUE        | EXIT        | UNDO            condition_value:          mysql_error_code