MYSQL 存儲過程和函數 案例 例子
這個也是做的項目,保存做個備份先。
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 ;
最後更新:2017-04-02 06:52:03