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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: 这个也是做的项目,保存做个备份先。 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
目录
相关文章
|
24天前
|
JSON 关系型数据库 MySQL
Mysql(5)—函数
MySQL提供了许多内置的函数以帮助用户进行数据操作和分析。这些函数可以分为几类,包括聚合函数、字符串函数、数值函数、日期和时间函数、控制流函数等。
68 1
Mysql(5)—函数
|
30天前
|
SQL 关系型数据库 MySQL
案例剖析:MySQL唯一索引并发插入导致死锁!
案例剖析:MySQL唯一索引并发插入导致死锁!
案例剖析:MySQL唯一索引并发插入导致死锁!
|
30天前
|
SQL 关系型数据库 MySQL
案例剖析,MySQL共享锁引发的死锁问题!
案例剖析,MySQL共享锁引发的死锁问题!
|
30天前
|
消息中间件 关系型数据库 MySQL
大数据-117 - Flink DataStream Sink 案例:写出到MySQL、写出到Kafka
大数据-117 - Flink DataStream Sink 案例:写出到MySQL、写出到Kafka
115 0
|
5天前
|
关系型数据库 MySQL Serverless
MySQL函数
最常用的MySQL函数,包括聚合函数,字符串函数,日期时间函数,控制流函数等
|
8天前
|
存储 SQL NoSQL
|
14天前
|
关系型数据库 MySQL 数据库
一个 MySQL 数据库死锁的案例和解决方案
本文介绍了一个 MySQL 数据库死锁的案例和解决方案。
19 3
|
17天前
|
存储 关系型数据库 MySQL
基于案例分析 MySQL 权限认证中的具体优先原则
【10月更文挑战第26天】本文通过具体案例分析了MySQL权限认证中的优先原则,包括全局权限、数据库级别权限和表级别权限的设置与优先级。全局权限优先于数据库级别权限,后者又优先于表级别权限。在权限冲突时,更严格的权限将被优先执行,确保数据库的安全性与资源合理分配。
|
9天前
|
SQL NoSQL 关系型数据库
|
20天前
|
关系型数据库 MySQL 数据库
mysql中tonumber函数使用要注意什么
在处理这类转换操作时,考虑周全,利用提供的高性能云服务器资源,可以进一步提升数据库处理效率,确保数据操作的稳定性和安全性,尤其是在处理大量数据转换和运算密集型应用时。
66 0