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. 用php读取xml数据

    parser是php内置的一个用来处理xml的解析器,它的工作由三个事件组成:起始标签. 读取数据.结束标签. 也就是说在对xml进行处理的时候每当遇到起始标签.数据和结束标签的时候函数会做相应的动作 ...

  2. NPOI导出Excel,添加图片和设置格式,添加条形码

    先上代码 using grproLib; using System; using System.Collections.Generic; using System.Data; using System ...

  3. 裸机——iNand

    1.先晓得iNand的基础知识 iNand是在SD卡基础上发展来的,而SD卡是在MMC的基础上发展来的,MMC是在Nand的基础上发展来的 我们晓得Nand的基础知识,而MMC对Nand大致做了两个改 ...

  4. 4,远程连接Linux

    为什么要远程连接Linux 在实际的工作场景中,虚拟机界面或者物理服务器本地的终端都是很少接触的,因为服务器装完系统之后,都要拉倒IDC机房托管,如果是购买的云主机,那更碰不到服务器本体了,只能通过远 ...

  5. 质数,$\varphi$和$\mu$线性筛

    typedef long long ll; bool check[N]; int mu[N],pri[N],tot; ll phi[N]; void init(int lim){ check[]=,p ...

  6. Win7更换锁屏和开机画面

    技术交流群:233513714 每次开机被Windows千年不变的开机画面和锁屏画面丑到的小伙伴们可以看过来,通过简单的几步就可以改掉系统默认的开机画面. 1.首先Windows+r键输入regedi ...

  7. Kafka安装和常用操作命令

    Kafka安装: 下载kafka_2.10-0.8.2.1 1.关闭防火墙 2.修改配置文件  server.properties broker.id=1log.dirs= /usr/kafka_2. ...

  8. windows下进程间通信(转)

    摘 要 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的.Microsof ...

  9. 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(一)

    本文导航 -1. 注册并启用红帽订阅 -2. 使用静态 IP 地址配置网络 -3. 设置服务器的主机名称 -4. 更新或升级最小化安装的 CentOS -5. 安装命令行 Web 浏览器 -6. 安装 ...

  10. erlang节点局域网通信

    节点1: F:\WorkSpace\Server\src>erl -name hw@192.168.10.142 -setcookie 4213 consulting .erlang in &q ...