MYSQL 存储过程和函数 案例 例子

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 这个也是做的项目,保存做个备份先。 UCENTER里的 兑换 ucenter_reducelfb //调用数据 call ucenter_reducelfb(参数1,参数2,....) DELIMITER $USE `root`$DROP PROCEDURE IF EXISTS `ucenter_reducelfb`$CREATE DEFINER=`root`@`lo

这个也是做的项目,保存做个备份先。

UCENTER里的 兑换

ucenter_reducelfb //调用数据 call ucenter_reducelfb(参数1,参数2,....)

DELIMITER $

USE `root`$

DROP PROCEDURE IF EXISTS `ucenter_reducelfb`$

CREATE DEFINER=`root`@`localhost` PROCEDURE `ucenter_reducelfb`(in_appid INT,in_tel VARCHAR(11),in_num INT,in_oreason VARCHAR(1000))
/*by 夜色紫宸風 2011-10-25
*/
BEGIN
DECLARE t_tel VARCHAR(11) DEFAULT '';
DECLARE t_uid INT DEFAULT 0;
DECLARE t_uid2 INT DEFAULT 0;
DECLARE t_extcredits2 INT DEFAULT 0;
/*来福币设置*/
DECLARE t_tablename VARCHAR(100) DEFAULT 0;/*来福币表名称*/
DECLARE t_month VARCHAR(10) DEFAULT '';/*本月初*/
DECLARE t_month_next VARCHAR(10) DEFAULT '';/*下月初*/
DECLARE t_day VARCHAR(10) DEFAULT '';/*今天*/
DECLARE t_day_next VARCHAR(10) DEFAULT '';/*明天*/
DECLARE t_total INT DEFAULT 0;/*累计*/
/*兑换来福币设置*/
DECLARE t_appid INT DEFAULT 0;
DECLARE t_lfbeachmax INT DEFAULT 0;/*单次兑换数值大于配置的值*/
DECLARE t_lfblimit INT DEFAULT 0;/*剩余来福币*/
DECLARE t_lfbpersondaymax INT DEFAULT 0;/*用户当天累计大于配置的值*/
DECLARE t_lfbpersonmonthmax INT DEFAULT 0;/*用户当月累计大于配置的值*/
DECLARE t_lfbappdaymax INT DEFAULT 0;/*应用当天累计大于配置的值*/
DECLARE t_lfbappmonthmax INT DEFAULT 0;/*应用当月累计大于配置的值*/
DECLARE	t_operate VARCHAR(10);


DECLARE t_check INT DEFAULT 0;
DECLARE out_return INT DEFAULT 0;
DECLARE tmp INT DEFAULT 0;
DECLARE t_ym INT DEFAULT 0;

SET t_tablename=CONCAT('sz_app_credit_log_',DATE_FORMAT(NOW() ,'%Y%m'));

SET @sqlstr = CONCAT('CREATE TABLE IF NOT EXISTS `',t_tablename,'` (',
'`lid` int(11) NOT NULL AUTO_INCREMENT,',
'`uid` int(11) NOT NULL DEFAULT 0,',
'`operate` enum(''query'',''add'',''reduce'') NOT NULL,',
'`appid` int(11) NOT NULL DEFAULT 0,',
'`ovalue` int(11) NOT NULL DEFAULT 0,',
'`ostatus` int(11) NOT NULL DEFAULT 0,',
'`oreason` varchar(255) NOT NULL,',
'`dateline` int(11) NOT NULL DEFAULT 0,',
'`credittype` tinyint(4) NOT NULL,',
'PRIMARY KEY (`lid`)',
') ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;');
PREPARE stmt FROM @sqlstr;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SELECT uid,tel INTO t_uid,t_tel FROM sz_ucenter_members WHERE tel=in_tel;

IF t_uid>0 THEN
		/*检测主站是否存在该用户*/
		SELECT uid,extcredits2 INTO t_uid2,t_extcredits2 FROM sz_common_member_count WHERE uid=t_uid;

		IF t_uid2>0 THEN
				/*兑换来福币检测开始-----------------------------------------------*/
				SET t_operate='reduce';
				SELECT appid,lfbeachmax,lfblimit,lfbpersondaymax,lfbpersonmonthmax,lfbappdaymax,lfbappmonthmax INTO t_appid,t_lfbeachmax,t_lfblimit,t_lfbpersondaymax,t_lfbpersonmonthmax,t_lfbappdaymax,t_lfbappmonthmax FROM sz_app_credit_config WHERE appid = in_appid;
				IF t_appid>0 THEN
					/*单次兑换数值大于配置的值*/
					IF in_num>t_lfbeachmax THEN
						SET t_check=-12;
					ELSE
						IF t_operate='reduce' THEN
							/*用户来福币不足兑换*/
							IF (t_extcredits2-in_num)<t_lfblimit THEN
								SET t_check=-12;
							ELSE
								IF (t_extcredits2-in_num)<0 THEN
									SET t_check=-12;	
								END IF;
							END IF;
						END IF;
						SET t_day=UNIX_TIMESTAMP(DATE_FORMAT(NOW() ,'%Y-%m-%d'));
						SET t_day_next=UNIX_TIMESTAMP(DATE_ADD(DATE_FORMAT(NOW() ,'%Y-%m-%d'),INTERVAL 1 DAY));
						SET t_month=UNIX_TIMESTAMP(DATE_FORMAT(NOW() ,'%Y-%m-01'));
						SET t_month_next=UNIX_TIMESTAMP(DATE_ADD(DATE_FORMAT(NOW() ,'%Y-%m-01'),INTERVAL 1 MONTH));
						LABLEpersonday : BEGIN
							IF t_check<0 THEN
								LEAVE LABLEpersonday;
							END IF;
							/*比较当天累计*/
							SET @sqlstr = CONCAT('select sum(ovalue) INTO @total FROM ',t_tablename,' where appid=',in_appid,' and credittype =1  and uid=',t_uid,' and operate=''',t_operate,'''  and  dateline>=',t_day,' AND dateline<',t_day_next);
							PREPARE stmt FROM @sqlstr;
							EXECUTE stmt;
							DEALLOCATE PREPARE stmt;
							SET t_total=IFNULL(@total,0);
							
							/*用户当天累计大于配置的值*/
							IF (t_total+in_num)>t_lfbpersondaymax THEN
								SET t_check=-13;
							END IF;
						END LABLEpersonday;
						/*比较当月累计*/
						LABLEpersonmonth : BEGIN
							IF t_check<0 THEN
								LEAVE LABLEpersonmonth;
							END IF;
							SET @sqlstr = CONCAT('select sum(ovalue) INTO @total FROM ',t_tablename,' where appid =',in_appid,' and credittype =1 and uid=',t_uid,' and operate =''',t_operate,''' and dateline>=',t_month,' and dateline <',t_month_next);
							PREPARE stmt FROM @sqlstr;
							EXECUTE stmt;
							DEALLOCATE PREPARE stmt;
							SET t_total=IFNULL(@total,0);
							/*用户当月累计大于配置的值*/
							IF (t_total+in_num)>t_lfbpersonmonthmax THEN
								SET t_check=-14;
							END IF;
						END LABLEpersonmonth;
						/*比较应用当天累计*/
						LABLEappday : BEGIN
							IF t_check<0 THEN
								LEAVE LABLEappday;
							END IF;
							SET @sqlstr = CONCAT('select sum(ovalue) INTO @total FROM ',t_tablename,' where appid =',in_appid,' and credittype = 1  and operate =''',t_operate,''' and dateline>=',t_day,' and dateline <',t_day_next);
							PREPARE stmt FROM @sqlstr;
							EXECUTE stmt;
							DEALLOCATE PREPARE stmt;
							SET t_total=IFNULL(@total,0);
							/*应用当天累计大于配置的值*/
							IF (t_total+in_num)>t_lfbappdaymax THEN
								SET t_check=-15;
							END IF;
						END LABLEappday;
						/*比较当月累计*/
						LABLEappmonth : BEGIN
							IF t_check<0 THEN
								LEAVE LABLEappmonth;
							END IF;
							SET @sqlstr = CONCAT('select sum(ovalue) INTO @total FROM ',t_tablename,' where appid=',in_appid,' and credittype =1  and operate =''',t_operate,''' and dateline>=',t_month,' and dateline<',t_month_next);
							PREPARE stmt FROM @sqlstr;
							EXECUTE stmt;
							DEALLOCATE PREPARE stmt;
							SET t_total=IFNULL(@total,0);
							/*应用当月累计大于配置的值*/
							IF (t_total+in_num)>t_lfbappmonthmax THEN
								SET t_check=-16;
							ELSE
								/*符合兑换条件*/
								SET t_check=1;
							END IF;
						END LABLEappmonth;

					END IF;
				ELSE
					/*该应用没有配置积分兑换限制或者没有该应用*/
					SET t_check=-11;
				END IF;

				/*兑换来福币检测结束-----------------------------------------------*/
				IF t_check=1 THEN
					/*判断用户积分是否足够*/
					IF t_extcredits2<in_num THEN
						/*来福币操作日志*/
						SET tmp= common_lfbchange_log(in_appid,in_tel,in_num,2,in_oreason,4);
						SET t_check=-3;
						SET out_return= -3;
					ELSE
						/*更新用户积分*/
						UPDATE sz_common_member_count SET extcredits2 =extcredits2-in_num WHERE uid=t_uid;
						/*查询用户积分*/
						SELECT extcredits2 INTO t_extcredits2 FROM sz_common_member_count WHERE uid=t_uid;
						/*写更新日志*/
						SET @sqlstr=CONCAT('INSERT INTO ',t_tablename,' (`uid`,`operate`,`credittype`,`appid`,`ovalue`,`oreason`,`dateline`,`ostatus`) values (',t_uid,',''reduce'',1,',in_appid,',',in_num,',''',in_oreason,''',',UNIX_TIMESTAMP(NOW()),',',t_extcredits2,')');
						PREPARE stmt FROM @sqlstr;
						EXECUTE stmt;
						DEALLOCATE PREPARE stmt;
						/*来福币操作日志*/
						SET tmp= common_lfbchange_log(in_appid,in_tel,in_num,2,in_oreason,0);
						SET out_return= t_extcredits2;
						
					END IF;
				ELSE
					/*来福币操作日志*/
					SET tmp= common_lfbchange_log(in_appid,in_tel,in_num,2,in_oreason,t_check);
					SET out_return= t_check;
				END IF;
				
		/*苏州生活网不存在该用户*/
		ELSE
			/*来福币日志*/
			SET tmp= common_lfbchange_log(in_appid,in_tel,in_num,2,in_oreason,2);
			SET out_return=-1;
		END IF;
/*ucenter 中不存在该用户*/
ELSE
		/*来福币日志*/
		SET tmp= common_lfbchange_log(in_appid,in_tel,in_num,2,in_oreason,1);
		SET out_return= -1;
END IF;
SELECT out_return;
END$

DELIMITER ;

common_lfbchange_log

DELIMITER $

USE `root`$

DROP FUNCTION IF EXISTS `common_lfbchange_log`$

CREATE DEFINER=`root`@`localhost` FUNCTION `common_lfbchange_log`(in_appid INT,in_tel VARCHAR(11),in_num INT,in_type INT,in_oreason VARCHAR(500),in_result INT) RETURNS INT(11)
    NO SQL
    COMMENT 'type 1:添加 2:减少\r\nresult  0:成功 1:ucenter中没有该用户 2:苏州生活网中不存在该用户'
BEGIN
/*by 夜色紫宸風 2011-10-25
*/
INSERT INTO sz_common_lfbchange_log (`appid`,`tel`,`num`,`type`,`oreason`,`result`,`dateline`) VALUES (in_appid,in_tel,in_num,in_type,in_oreason,in_result,UNIX_TIMESTAMP(NOW()));
RETURN 0;
END$

DELIMITER ;


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1天前
|
存储 关系型数据库 MySQL
10个案例告诉你mysql不使用子查询的原因
大家好,我是V哥。上周与朋友讨论数据库子查询问题,深受启发。为此,我整理了10个案例,详细说明如何通过优化子查询提升MySQL性能。主要问题包括性能瓶颈、索引失效、查询优化器复杂度及数据传输开销等。解决方案涵盖使用EXISTS、JOIN、IN操作符、窗口函数、临时表及索引优化等。希望通过这些案例,帮助大家在实际开发中选择更高效的查询方式,提升系统性能。关注V哥,一起探讨技术,欢迎点赞支持!
|
15天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
16天前
|
SQL 关系型数据库 MySQL
MySQL常见函数第二期,你都用过哪些呢 ?
本期介绍了20个常用的MySQL函数,涵盖日期处理(如CURDATE()、DATE_FORMAT())、数学运算(如ABS()、ROUND())、统计分析(如COUNT()、SUM())等,帮助提高SQL查询效率和数据处理能力。希望对大家的学习有所帮助。
59 7
|
18天前
|
关系型数据库 MySQL
MySQL常见函数第一期,你都用过哪些呢 ?
本期介绍10个常用的MySQL函数:字符串连接(CONCAT)、提取子字符串(SUBSTRING)、获取字符串长度(LENGTH)、转换大小写(UPPER、LOWER)、去除空格(TRIM)、替换字符串(REPLACE)、查找子字符串位置(INSTR)、带分隔符的字符串连接(CONCAT_WS)以及获取当前日期时间(NOW)。
56 8
|
19天前
|
数据采集 关系型数据库 MySQL
MySQL常用函数:IF、SUM等用法
本文介绍了MySQL中常用的IF、SUM等函数及其用法,通过具体示例展示了如何利用这些函数进行条件判断、数值计算以及复杂查询。同时,文章还提到了CASE WHEN语句和其他常用函数,如COUNT、AVG、MAX/MIN等,强调了它们在数据统计分析、数据清洗和报表生成中的重要性。
|
23天前
|
关系型数据库 MySQL 数据处理
【MySQL】函数
MySQL 提供了丰富的函数集,涵盖字符串处理、数值运算、日期时间操作和聚合计算等多个方面。这些函数在日常数据库操作中极为重要,通过合理使用这些函数,可以大大提高数据处理和查询的效率。用户还可以通过自定义函数,扩展 MySQL 的功能以满足特定需求。
26 3
|
25天前
|
关系型数据库 MySQL 数据处理
MySQL函数与约束
MySQL 提供了丰富的函数和强大的约束机制,用于数据处理和完整性维护。通过掌握这些工具,可以有效地管理和分析数据库中的数据,确保数据的一致性和准确性。无论是在日常数据查询中使用内置函数,还是在数据库设计中应用各种约束,都是确保数据库系统稳定、高效运行的关键。希望本文对您理解和应用 MySQL 函数与约束有所帮助。
30 1
|
1月前
|
关系型数据库 MySQL Serverless
MySQL函数
最常用的MySQL函数,包括聚合函数,字符串函数,日期时间函数,控制流函数等
37 1
|
1月前
|
存储 SQL NoSQL
|
1月前
|
SQL NoSQL 关系型数据库

热门文章

最新文章