BEGIN
DECLARE trainee_no_value BIGINT (20); -- 学员编号
DECLARE pay_no_value BIGINT (20); -- 交费序号
DECLARE deposit_value BIGINT (20); -- 预定金
DECLARE pay_type_value CHAR (2); -- 交费性质

DECLARE done INT DEFAULT FALSE;

DECLARE startSynctime datetime DEFAULT NOW();
-- 异常信息变量
DECLARE eerrorcode CHAR(5);
DECLARE msg TEXT;

DECLARE trainee_no_cur CURSOR FOR
SELECT TRAINEE_NO,PAY_NO,DEPOSIT,PAY_TYPE FROM trainee_pay_info
WHERE
DELETE_KBN = '0'
AND PAY_AMOUNT > 0
AND PAY_KBN = '02'
AND DEPOSIT > 0
AND TRUE_FINANCE_TIME IS NOT NULL
AND PAY_TYPE IN ('01','03','04')
ORDER BY TRAINEE_NO ASC,PAY_NO DESC;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 异常检测和信息的存储
DECLARE EXIT HANDLER FOR SQLEXCEPTION

BEGIN
ROLLBACK;

GET DIAGNOSTICS CONDITION 1 eerrorcode = RETURNED_SQLSTATE, msg = MESSAGE_TEXT;
INSERT INTO renshi.syncrecord_history(record_result,record_time,record_type,start_time)
VALUES(CONCAT('更新预定金学费序号发生了错误。错误原因是:',msg,'。','错误代号为:',eerrorcode),NOW(),'12',startSynctime);
END;

-- 打开事务
START TRANSACTION;

-- 循环游标
-- 打开游标
OPEN trainee_no_cur;
DELETE FROM trainee_pay_info1;
-- 声明结束的时候
myLoop: LOOP

FETCH trainee_no_cur INTO trainee_no_value,pay_no_value,deposit_value,pay_type_value;
IF done THEN
INSERT INTO renshi.syncrecord_history(record_result,record_time,record_type,start_time)
VALUES('更新预定金学费序号成功',NOW(),'12',startSynctime);
LEAVE myLoop;
END IF;
IF pay_type_value <> '01' THEN
BEGIN
DECLARE pay_no_value_02 BIGINT (20);-- 交费序号
DECLARE pay_amount_value_02 BIGINT (20); -- 交费金额
DECLARE trainee_no_cur_02 CURSOR FOR
SELECT MAX(PAY_NO) AS PAY_NO,PAY_AMOUNT FROM trainee_pay_info
WHERE
DELETE_KBN = '0'
AND PAY_KBN = '01'
AND HANDIN_KBN = '03'
AND TRAINEE_NO = trainee_no_value
AND PAY_NO < pay_no_value
AND HANDIN_STYLE_KBN = '02'
AND HANDIN_PAY_NO IS NULL;
OPEN trainee_no_cur_02;
FETCH trainee_no_cur_02 INTO pay_no_value_02,pay_amount_value_02;
IF pay_amount_value_02 = deposit_value THEN
UPDATE trainee_pay_info
SET trainee_pay_info.HANDIN_PAY_NO = pay_no_value,trainee_pay_info.UPDATE_TIME = NOW()
WHERE TRAINEE_NO = trainee_no_value AND PAY_NO = pay_no_value_02;
ELSE
INSERT INTO renshi.syncrecord_history
SELECT TRAINEE_NO,PAY_NO,DELETE_KBN,CREATE_TIME,UPDATE_TIME FROM trainee_pay_info
WHERE TRAINEE_NO = trainee_no_value AND PAY_NO = pay_no_value;
END IF;
CLOSE trainee_no_cur_02;
END;
ELSE
BEGIN
DECLARE pay_no_value_01 BIGINT (20);-- 交费序号
DECLARE pay_amount_value_01 BIGINT (20); -- 交费金额
DECLARE trainee_no_cur_01 CURSOR FOR
SELECT MAX(PAY_NO) AS PAY_NO,PAY_AMOUNT FROM trainee_pay_info
WHERE
DELETE_KBN = '0'
AND PAY_KBN = '01'
AND HANDIN_KBN = '03'
AND TRAINEE_NO = trainee_no_value
AND PAY_NO < pay_no_value
AND HANDIN_STYLE_KBN = '01'
AND HANDIN_PAY_NO IS NULL;
OPEN trainee_no_cur_01;
FETCH trainee_no_cur_01 INTO pay_no_value_01,pay_amount_value_01;
IF pay_amount_value_01 = deposit_value THEN
UPDATE trainee_pay_info
SET trainee_pay_info.HANDIN_PAY_NO = pay_no_value,trainee_pay_info.UPDATE_TIME = NOW()
WHERE TRAINEE_NO = trainee_no_value AND PAY_NO = pay_no_value_01;
ELSE
INSERT INTO trainee_pay_info1
SELECT TRAINEE_NO,PAY_NO,DELETE_KBN,CREATE_TIME,UPDATE_TIME FROM trainee_pay_info
WHERE TRAINEE_NO = trainee_no_value AND PAY_NO = pay_no_value;
END IF;
CLOSE trainee_no_cur_01;
END;
END IF;
END LOOP;
CLOSE trainee_no_cur;
COMMIT;
END

mysql 游标的嵌套使用示例的更多相关文章

  1. SqlServer和MySQL游标学习

    一 sqlserver游标使用 /*** 游标的使用  讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱.  使用游标的顺序: 声名游标.打开游标.读取数据.关闭游标.删除游标. 1.3.1 ...

  2. Mysql高手系列 - 第19篇:mysql游标详解,此技能可用于救火

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第19篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...

  3. html嵌套表格示例

    常用嵌套表格示例,出自<网页开发手记:HTML+CSS+JavaScript实战详解>   <html>   <head>   <title>嵌套表格布 ...

  4. MySQL游标操作指南

    本篇文章是对MySQL游标的具体使用进行了详细的分析介绍,需要的朋友参考下   测试表 level  代码如下: create table test.level (name varchar(20)); ...

  5. 个人笔记mysql游标

    经过测试,mysql游标是无法读取自定义函数计算的结构,mysql自带的函数计算值是可以读取的.

  6. MySQL游标的简单实践

    Q:为什么要使用游标? A: 在存储过程(或函数)中,如果某条select语句返回的结果集中只有1行,可以使用select into语句(上几篇博客有介绍到用法)来得到该行进行处理:如果结果集中有多行 ...

  7. mysql 游标 demo

    一.MySQL游标的概念 1.游标介绍 MySQL的游标(cursor)是一个重要的概念,通过查找资料与自己的理解,主要得出以下几点关于自己的理解. 有数据缓冲的思想:游标的设计是一种数据缓冲区的思想 ...

  8. [转]MySQL游标的使用

    转自:http://www.cnblogs.com/sk-net/archive/2011/09/07/2170224.html 以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的S ...

  9. Mysql 游标初识

    MySql 游标初识 认识 游标(cursor), 按字面意思可理解为, 游动的标识, 或者叫做"光标", 这样更容易理解. 就好比现有一张表存储了n行记录, 然后我想每次取出一行 ...

随机推荐

  1. linux epoll用法

    epoll 是 linux 特有的 I/O 复用函数.它是把用户关心的文件描述符事件放在内核的一个事件列表中,故而,无须像select和poll一样每次调用都重复传入文件描述符或事件集.但是, epo ...

  2. shell+vim——05

    ln --->link 链接, 链接有两种: 软连接 ln -s 源文件 目标文件   :相当于创建了一个快捷方式,源文件损坏后这个链接也就失效了 ln -s  a.text  a.text.s ...

  3. 理解canvas路径

    canvas路径和ps里面的路径差不多,在进行图形绘制时,先绘制出来图形的路径,然后再描边或者填充. canvas路径还有子路径的概念,在某一时刻,canvas之中只能有一条路径存在,Canvas规范 ...

  4. urllib使用三--urlretrieve下载文件

    下载文件 urllib.urlretrieve() 参数: url:远程地址 filename:要保存到本地的文件 reporthook:下载状态报告 data:有就变成POST请求,有格式要求 返回 ...

  5. 笔记-ORM-sqlalchemy

    笔记-ORM-sqlalchemy 1.      ORM 1.1.    ORM框架简介 对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发 ...

  6. 缓存(CDN缓存,浏览器(客户端)缓存)

    1.什么是缓存? 缓存是一种数据结构,用于快速查找以及执行的操作结果.因此,如果一个操作执行起来很慢,对于常用的输入数据就可以将操作的结果缓存,并在下次调用该操作时使用缓存的数据. 缓存是一个到处都存 ...

  7. laravel5.5用户认证

    目录 1. 命令 2. 快速认证 2.1 自定义路径 2.2 自定义用户名 2.3 自定义看守器 2.4 自定义验证/存储 2.5 Auth::xx() 2.6 保护路由 2.7 指定看守器 3 手动 ...

  8. Pascal小游戏 随机函数

    一个被人写滥了的小程序,新手学习,Pascal By Chaobs 初学者可以用它来学习随机函数的运用,当然你完全可以自己写一个随机函数. var   player1,player2:longint; ...

  9. 《算法》C++代码 前言

    现在大二正在上<数据结构>课,课内的书上代码实现很喜欢无脑用类.变量名字很长,而且常常实现太繁琐,并且代码有些无法运行,这些对于老手无所谓,但初学者看起来却会很不舒服.因此写点自己的代码, ...

  10. 珍藏版 Python 开发工程师面试试题

    珍藏版 Python 开发工程师面试试题 说明:不拿到几家公司的offer,那就是卑鄙的浪费 一.Python_基础语法 1.可变与不可变类型: 2.浅拷贝与深拷贝的实现方式.区别:deepcopy如 ...