游标,存储过程
发布时间:2020-05-23 08:01:10 所属栏目:MySql 来源:互联网
导读:游标,存储过程
|
下面是脚本之家 jb51.cc 通过网络收集整理的代码片段。 脚本之家小编现在分享给大家,也给大家做个参考。 DELIMITER $$
USE `eloan_tj`$$
DROP PROCEDURE IF EXISTS `pro_d_tender_updatecount`$$
CREATE DEFINER=`dba`@`%` PROCEDURE `pro_d_tender_updatecount`(IN pownerid INT)
BEGIN
-- 借款成功次数 i=循环标识符
DECLARE cid,i INT;
-- 成功借款时间','号分割 2012-03-19,2012-03-19
DECLARE cdatestr TEXT;
-- 两次时间
DECLARE dateS,dateE VARCHAR(50);
SET i = 1;
-- 借款成功次数,借款成功时间
SELECT
COUNT(DISTINCT FROM_UNIXTIME(cdate,'%Y-%m-%d')),GROUP_CONCAT(DISTINCT FROM_UNIXTIME(cdate,'%Y-%m-%d') ORDER BY cdate)
INTO cid,cdatestr FROM d_tender_repayment WHERE borrowerid = pownerid;
SELECT GROUP_CONCAT(DISTINCT FROM_UNIXTIME(cdate,'%Y-%m-%d') ORDER BY cdate) gcdate INTO cdatestr FROM d_tender_repayment WHERE borrowerid = pownerid;
WHILE i <= cid DO
SELECT SUBSTRING_INDEX(cdatestr,',i-1) INTO dateS; -- 上次时间
SELECT SUBSTRING_INDEX(cdatestr,i) INTO dateE; -- 这次时间
SET dateS = UNIX_TIMESTAMP(SUBSTRING_INDEX(dateS,-1));-- 上次','最后时间
SET dateE = UNIX_TIMESTAMP(SUBSTRING_INDEX(dateE,-1));-- 这次','最后时间
IF i = 1 THEN
UPDATE d_tender SET bidding = 0 WHERE cdate <= dateE AND ownerid = pownerid;
ELSE
UPDATE d_tender SET bidding = i-1 WHERE cdate >= dateS AND cdate <= dateE AND ownerid = pownerid;
END IF;
SET i= i +1;
END WHILE;
-- 大于最后时间
UPDATE d_tender SET bidding = cid WHERE cdate >= dateE AND ownerid = pownerid;
-- 未借款成功
UPDATE d_tender SET bidding = 0 WHERE bidding IS NULL;
END$$
DELIMITER ;
CALL pro_d_tender(94)
SELECT ownerid,bidding,FROM_UNIXTIME(cdate,'%Y-%m-%d') FROM d_tender WHERE ownerid = 94
-- 2012-05-17
-- 2013-06-25
-- 2013-09-04
-- 2013-12-11
SELECT DISTINCT FROM_UNIXTIME(cdate,'%Y-%m-%d') gcdate FROM d_tender_repayment WHERE borrowerid =94;
SELECT ownerid,'%Y-%m-%d') FROM d_tender WHERE ownerid = 416
-- 2012-03-19
-- 2012-09-19
SELECT DISTINCT FROM_UNIXTIME(cdate,'%Y-%m-%d') gcdate FROM d_tender_repayment WHERE borrowerid =416;
UPDATE d_tender SET bidding = NULL
CALL pro_updatecount
SELECT * FROM d_tender
DROP PROCEDURE IF EXISTS pro_updatecount;
DELIMITER $$
CREATE PROCEDURE pro_updatecount()
BEGIN
-- 声明一个标志done, 用来判断游标是否遍历完成
DECLARE done INT DEFAULT 0;
-- 声明一个变量,用来存放从游标中提取的数据
-- 特别注意这里的名字不能与由游标中使用的列明相同,否则得到的数据都是NULL
DECLARE pownerid VARCHAR(50) DEFAULT NULL;
-- 声明游标对应的 SQL 语句
DECLARE cur CURSOR FOR
SELECT ownerid FROM d_tender GROUP BY ownerid;
-- 在游标循环到最后会将 done 设置为 1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 执行查询
OPEN cur;
-- 遍历游标每一行
REPEAT
-- 把一行的信息存放在对应的变量中
FETCH cur INTO pownerid;
IF NOT done THEN
-- 这里就可以使用 pownerid对应的信息了
CALL pro_d_tender_updatecount(pownerid);
END IF;
UNTIL done END REPEAT;
CLOSE cur;
END
$$
DELIMITER ;
以上是脚本之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。 如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
