`
dota_00085
  • 浏览: 11119 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql 双游标游标嵌套循环

阅读更多
BEGIN
    declare tmp bigint default 0;
    declare uploaddate,currenttime DATETIME;
    declare freetraffic,sales,trafficpc,trafficapp,activity,calculate varchar(32);
    declare recordid,calid,errorsInfo int(11); 
    -- 计算过程中的变量 
    declare gmv,taxsales,priceindex,margin,guestsinglequantity,nontaxcost,Basket,goodsprice,priceadjustment double;
    declare ordernumber,totalsales int(11);
    declare goodscode varchar(10);
-- 定义第一个游标 取未计算的记录遍历
    declare cur CURSOR FOR
SELECT
id,upload_date,jd_free_traffic,jd_sales,paid_traffic_pc,paid_traffic_app,promotion_activity,data_calculate
FROM
ec_upload_across
WHERE
data_calculate ='no'
AND
upload_date < NOW()
ORDER BY
upload_date;
-- 定义第二个游标  取商品编号遍历
declare innrcur CURSOR FOR 
SELECT
goods_code
FROM
ec_jd_sales
WHERE
date=uploaddate;  -- 定义游标
declare continue handler for not found set tmp=1;
declare continue handler for sqlexception set errorsInfo =1;
    OPEN cur;  -- 打开游标  
    FETCH NEXT  from cur INTO recordid,uploaddate,freetraffic,sales,trafficpc,trafficapp,activity,calculate;  -- 游标向下走一步  
    WHILE(tmp=0)
    DO    
-- INSERT INTO ec_calculate_logs(start_time,record_id,deal_flag,status) values(NOW(),recordid,'N','N');-- 测试用
IF freetraffic ='yes' and freetraffic ='yes' and sales ='yes' and trafficpc ='yes' and trafficapp ='yes' and activity='yes'
THEN
START TRANSACTION;
set currenttime =NOW();
INSERT INTO ec_calculate_logs(start_time,record_id,deal_flag,status) values(currenttime,recordid,'N','N'); -- 写入ec_calculate_logs表中一条记录
select cal_id INTO calid from ec_calculate_logs where record_id=recordid AND start_time = currenttime;  -- 生成的主键ID
-- 开始计算
OPEN innrcur;  -- 打开游标
   FETCH NEXT  from innrcur INTO goodscode;  -- 游标向下走一步
WHILE(tmp=0)
DO    
-- 计算GMV、Margin
select tax_sales into taxsales from ec_jd_sales where date = uploaddate and goods_code=goodscode;
if taxsales IS NOT NULL
THEN
select COUNT(*) into priceindex from ec_promotion_activity where date = uploaddate and goods_code=goodscode;
if priceindex=0
THEN
SET priceindex=1.2;
ELSE
select price_index into priceindex from ec_promotion_activity where date = uploaddate and goods_code=goodscode;
if priceindex IS NULL
THEN SET priceindex=1.2;
end IF;
end IF;
-- 自定义测试异常
-- if goodscode = 1828002 THEN INSERT INTO ec_calculate_logs(start_time,record_id,deal_flag,status) values(currenttime,mx,'N','N'); end IF;
SET gmv=taxsales*priceindex;
update ec_jd_sales set GMV=gmv where date = uploaddate and goods_code=goodscode;
set margin=gmv-taxsales;
update ec_jd_sales set Margin=margin where date = uploaddate and goods_code=goodscode;
end IF;
-- 计算客单量
select COUNT(*) into ordernumber from ec_free_traffic where date = uploaddate and goods_code=goodscode;
select total_sales into totalsales from ec_jd_sales where date = uploaddate and goods_code=goodscode;
if ordernumber<>0
THEN
select order_number into ordernumber from ec_free_traffic where date = uploaddate and goods_code=goodscode;
if ordernumber IS NOT NULL OR ordernumber<>0
THEN
set guestsinglequantity=totalsales/ordernumber;
update ec_jd_sales set guest_single_quantity=guestsinglequantity where date = uploaddate and goods_code=goodscode;
-- 计算未税成本依赖于客单量
select non_tax_cost into nontaxcost from ec_jd_sales where date = uploaddate and goods_code=goodscode;
set Basket=guestsinglequantity*nontaxcost;
update ec_jd_sales set basket=Basket where date = uploaddate and goods_code=goodscode;
end IF;
end IF;
-- 计算京东(当天售价)调价
select COUNT(*) into priceadjustment from ec_promotion_activity where price_adjustment IS NULL AND date = uploaddate and goods_code=goodscode;
IF priceadjustment=1
THEN 
select goods_price into goodsprice from ec_jd_sales where date = uploaddate and goods_code=goodscode;
update ec_promotion_activity set price_adjustment=goodsprice where date = uploaddate and goods_code=goodscode;
end IF;
FETCH NEXT  from innrcur INTO goodscode;
END WHILE;
SET tmp=0;
   CLOSE innrcur;  -- 关闭游标 
-- 更新相关表的状态
update ec_calculate_logs set end_time=NOW(),status='Y' where cal_id =calid;
UPDATE ec_upload_across SET data_calculate='yes' WHERE id=recordid;
update ec_calculate_logs set deal_flag='Y' where cal_id =calid;
-- 发生异常回滚,正常提交
if errorsInfo=1
THEN 
ROLLBACK;
INSERT INTO ec_calculate_logs(start_time,record_id,deal_flag,status) values(currenttime,recordid,'N','N');
SET tmp=1;
ELSE 
commit;
end IF;
ELSE
SET tmp=1;
END IF;
       FETCH NEXT from cur INTO recordid,uploaddate,freetraffic,sales,trafficpc,trafficapp,activity,calculate;
    END WHILE;
    CLOSE cur;  -- 关闭游标  
END

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    mysql游标嵌套[文].pdf

    MySQL 游标嵌套实践 本文档旨在介绍 MySQL 游标嵌套的概念和实践,通过对游标的嵌套使用,演示如何实现复杂的数据操作。 一、游标嵌套简介 游标(Cursor)是数据库中的一种控制结构,可以用来遍历查询结果集。...

    mysql游标

    MySQL游标是数据库管理系统中一个重要的概念,它在处理大量数据时非常有用,尤其是在需要逐行处理查询结果的情况下。游标允许程序动态地访问和操作数据集,而不是一次性加载所有结果。在MySQL中,游标主要用于存储...

    Mysql存储过程循环内嵌套使用游标示例代码

    总结来说,这个示例展示了如何在MySQL存储过程中使用游标进行循环处理,并在循环内部再次嵌套游标以实现更精细的数据操作。这种技术在处理大量数据或执行复杂逻辑时非常有用,尤其是在需要逐行检查和处理数据的情况...

    mysql游标详解

    如果需要实现嵌套的游标循环,可以使用 BEGIN 和 END 语句来划分一个statement block,例如: DECLARE fetchSeqOk BOOLEAN; BEGIN DECLARE _seqname VARCHAR(50); DECLARE _value BIGINT(20); DECLARE ...

    mysql 多个游标依次执行

    mysql存储过程 多个游标循环(依次执行,非嵌套循环)REPEAT循环。有需要的可自行下载。

    mysql存储过程双层嵌套

    loop 游标双层嵌套循环 创建临时表, 游标

    Mysql的游标的定义使用及关闭深入分析

    以上就是MySQL游标的定义、使用和关闭的基本概念以及如何处理游标循环的细节。理解这些概念对于编写涉及复杂数据处理的存储过程至关重要。记住,游标虽然提供了逐行处理数据的能力,但也需要注意性能影响,因为它们...

    mysql 面试题.zip

    8. **MySQL游标** (05 MySQL游标.pptx) - 游标的概念和使用:学习如何在循环中逐行处理查询结果,提供更灵活的数据处理能力。 9. **50道myaql不全 不保证准确性.txt** 和 **MySql第二章练习.txt** - 这些可能是...

    MySQL性能优化中文手册

    优化存储过程时,应尽量减少嵌套循环和复杂的逻辑判断,使用适当的变量和游标来控制流程。同时,注意参数化查询可以防止SQL注入并提高执行效率。 函数优化通常涉及内置函数的使用和自定义函数的编写。内置函数已经...

    MySQL必知必会_dotzgx_MYSQL_

    7. **游标**:游标允许在结果集中逐行处理数据,特别是在需要循环遍历结果集时,游标非常实用。理解如何声明、打开、读取和关闭游标,以及在存储过程中如何使用它们。 8. **触发器**:触发器是数据库自动执行的预定...

    dbmove_sql语句转化.zip_MYSQL_dbmove_oracle

    Oracle中的游标和FOR循环在MySQL中通常需要用DECLARE、OPEN、FETCH和CLOSE等语句来实现,或者直接用嵌套的SELECT语句。 6. **连接与子查询**: Oracle的CONNECT BY用于构建层次查询,而在MySQL中可能需要递归的...

    一条SQL在MySQL中是如何执行的.zip

    可能使用嵌套循环JOIN、哈希JOIN或归并JOIN等不同算法,具体取决于数据量和索引情况。 如果有GROUP BY或ORDER BY子句,MySQL会进行额外的排序操作。对于GROUP BY,数据会被分组;对于ORDER BY,数据会被排序以满足...

    MySQL 5.0存储过程

    MySQL 5.0版本还引入了几个新特性,比如支持嵌套存储过程、游标和事务控制。嵌套存储过程允许在一个过程中调用另一个过程,增加了代码的模块化和复用性。游标则允许在过程内部逐行处理结果集,这对于迭代操作非常...

    MySQL必知必会1

    12. **游标**:讲解游标的概念,用于在循环中处理查询结果集。 13. **触发器**:介绍触发器的使用,它们可以在特定数据库事件(如插入、更新或删除)发生时自动执行指定的操作。 14. **表约束**:讨论如何使用约束...

    MySQL 入门到高级:基础篇 下篇-尚硅谷 2021年

    游标允许逐行处理查询结果,对于循环处理数据非常有用。 八、备份与恢复 MySQL提供了多种备份工具,如mysqldump和mysqlpump,用于创建数据库的逻辑备份。恢复则通过导入备份文件来实现。此外,还有InnoDB引擎支持的...

Global site tag (gtag.js) - Google Analytics