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. 腾讯首页分辨手机端与pc端代码

    腾讯首页分辨手机端与pc端代码 自己在做网页的时候在腾讯网首页借鉴的代码. 代码: <!-- 移动适配JS脚本 --> <script type="text/javascr ...

  2. C5509A启动使用定时器

    #include <stdio.h> #include <csl.h> #include <csl_pll.h> #include <csl_chip.h&g ...

  3. Android Config通用类来记录信息

    1.整体分析 1.1.源代码,可以直接Copy. public class Config { private static int M = 1024 * 1024; private volatile ...

  4. 9,Flask 中的蓝图(BluePrint)

    蓝图,听起来就是一个很宏伟的东西,在Flask中的蓝图 blueprint 也是非常宏伟的,它的作用就是将 功能 与 主服务 分开. 比如说,你有一个客户管理系统,最开始的时候,只有一个查看客户列表的 ...

  5. 9.4python开发之virtualenv与virtualenvwrapper

    在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程使用 ...

  6. android 多行文本显示的textView

    package com.zhangyue.iReader.common.view; import android.content.Context; import android.graphics.Ca ...

  7. 公布一些常用的WebServices

    天气预报Web服务,数据来源于中国气象局  Endpoint   Disco   WSDL IP地址来源搜索 WEB 服务(是目前最完整的IP地址数据)  Endpoint   Disco   WSD ...

  8. centos使用--supervisor使用

    目录 1 下载程序并安装 2 编辑配置文件 3 supervisor的使用 4 配置文件详细解析 参考资料 supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变 ...

  9. 剑指Offer - 九度1351 - 数组中只出现一次的数字

    剑指Offer - 九度1351 - 数组中只出现一次的数字2013-11-23 01:23 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. ...

  10. 【The VC Dimension】林轩田机器学习基石

    首先回顾上节课末尾引出来的VC Bound概念,对于机器学习来说,VC dimension理论到底有啥用. 三点: 1. 如果有Break Point证明是一个好的假设集合 2. 如果N足够大,那么E ...