mysql 游标的嵌套使用示例
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 游标的嵌套使用示例的更多相关文章
- SqlServer和MySQL游标学习
一 sqlserver游标使用 /*** 游标的使用 讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱. 使用游标的顺序: 声名游标.打开游标.读取数据.关闭游标.删除游标. 1.3.1 ...
- Mysql高手系列 - 第19篇:mysql游标详解,此技能可用于救火
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第19篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...
- html嵌套表格示例
常用嵌套表格示例,出自<网页开发手记:HTML+CSS+JavaScript实战详解> <html> <head> <title>嵌套表格布 ...
- MySQL游标操作指南
本篇文章是对MySQL游标的具体使用进行了详细的分析介绍,需要的朋友参考下 测试表 level 代码如下: create table test.level (name varchar(20)); ...
- 个人笔记mysql游标
经过测试,mysql游标是无法读取自定义函数计算的结构,mysql自带的函数计算值是可以读取的.
- MySQL游标的简单实践
Q:为什么要使用游标? A: 在存储过程(或函数)中,如果某条select语句返回的结果集中只有1行,可以使用select into语句(上几篇博客有介绍到用法)来得到该行进行处理:如果结果集中有多行 ...
- mysql 游标 demo
一.MySQL游标的概念 1.游标介绍 MySQL的游标(cursor)是一个重要的概念,通过查找资料与自己的理解,主要得出以下几点关于自己的理解. 有数据缓冲的思想:游标的设计是一种数据缓冲区的思想 ...
- [转]MySQL游标的使用
转自:http://www.cnblogs.com/sk-net/archive/2011/09/07/2170224.html 以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的S ...
- Mysql 游标初识
MySql 游标初识 认识 游标(cursor), 按字面意思可理解为, 游动的标识, 或者叫做"光标", 这样更容易理解. 就好比现有一张表存储了n行记录, 然后我想每次取出一行 ...
随机推荐
- Pythony的数据类型和变量使用方法详解
数据类型:计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需要定 ...
- C语言函数篇(五)静态库和动态库的创建和使用
使用库函数是源码的一种保护??? <我猜的.> 库函数其实不是新鲜的东西,我们一直都在用,比如C库. 我们执行pringf() 这个函数的时候,就是调用C库的函数. 下面记录静态库和动态库 ...
- 邮件系统之Postfix与Dovecot
电子邮件系统 电子邮件系统基于邮件协议来完成电子邮件的传输,常见的邮件协议有: 简单邮件传输协议(Simple Mail Transfer Protocol,SMTP):用于发送和中转发出的电子邮件, ...
- 通过Aspose.Word和ZXING生成复杂的WORD表格
1.前言 这是我之前做的一个项目中要求的功能模块,它的需求是生成一个WORD文档,需要每页一个表格并且表格中需要插入文字.条形码和二维码等信息,页数可控制.具体的效果如下图所示: 可以看到有以下几点是 ...
- Android Stadio 导入moudle 不显示
Android Stadio 导入moudle 不显示,moudle 里面的java类也没有识别,只当是普通的txt文件. 后来,我发现,每个moudle 都有一个.iml 文件~ 然后我就随便翻翻配 ...
- qq登录面板
- laravel5.5中间件
目录 1. 中间件知识 1. artisan 命令 2. 文件内容 3. 前置中间件和后置中间件 4. 使用中间件 2. 控制器中间件 1. 中间件知识 1. artisan 命令 php artis ...
- PJMEDIA之录音器的使用(capture sound to avi file)
为了熟悉pjmedia的相关函数以及使用方法,这里练习了官网上的一个录音器的例子. 核心函数: pj_status_t pjmedia_wav_writer_port_create ( pj_pool ...
- DOS程序员手册(一)
当今MS-Windows横扫大江南北,让我们这就来研究一下它的祖宗——MS-DOS! 这本书很难得,希望读者好好学习! DOS程序员手册(一) DOS教程 (以下内容全部为原作者的阐述,照样保留) 这 ...
- SVN迁移到Git原因说明
1.Git分布式的源码管理 每位开发人员计算机本地会有一份代码库,开发人员可在不受其他人代码提交影响的前提下对源码进行提交/回滚/撤销等操作. 在独立的开发任务中即可实现对源码管理又不受其他开发人员提 ...