MySQL存储过程的创建
(1). 格式
MySQL存储过程创建的格式:CREATE PROCEDURE 过程名 ([过程参数[,...]])
[特性 ...] 过程体
这里先举个例子:
- mysql> DELIMITER //
- mysql> CREATE PROCEDURE proc1(OUT s int)
- -> BEGIN
- -> SELECT COUNT(*) INTO s FROM user;
- -> END
- -> //
- mysql> DELIMITER ;
注:
(1)这里需要注意的是DELIMITER //和DELIMITER ;两句,DELIMITER是分割符的意思,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。
(2)存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。
(3)过程体的开始与结束使用BEGIN与END进行标识。
这样,我们的一个MySQL存储过程就完成了,是不是很容易呢?看不懂也没关系,接下来,我们详细的讲解。
下面的例子主要用到了
Ⅰ. if-then -else语句
Ⅰ. FOUND_ROWS() 语句
#记录每天的步行、睡眠、体重、消耗卡路里等信息 #userRecordDetail 表中,如果存在当天数据,则修改,否则新增 #userRecord 表中,如果存在,则累加,否则新增 #类型:1步行2睡眠3卡路里消耗4体重 #CALL userRecord_create(1001,45,100,1000,1000,500,500,2,1); DROP PROCEDURE IF EXISTS pro_userRecord_stepNum; DELIMITER // CREATE PROCEDURE pro_userRecord_stepNum(IN p_userId INT,IN p_stepNum INT) BEGIN DECLARE RCount INT; -- 查看用户是否有详细记录 SELECT id FROM userRecordDetail WHERE userId = p_userId AND DATE(createTime) = CURDATE() LIMIT 1; SELECT FOUND_ROWS() INTO RCount; IF (RCount=0) THEN -- 查看userRecord是否有用户总记录信息,不存在,则添加,否则修改 SELECT id FROM userRecord WHERE userId = p_userId LIMIT 1; SELECT FOUND_ROWS() INTO RCount; IF(RCount = 0 )THEN INSERT INTO `userRecord`(`userId`,`totalStep`,`updateTime`,`createTime`) VALUES (p_userId,p_stepNum,NOW(),NOW()); ELSE UPDATE userRecord SET totalStep = totalStep+p_stepNum WHERE userId = p_userId; END IF; -- 结束 -- 插入一条用户记录详细信息 INSERT INTO `userRecordDetail`(`weigh`,`calorie`,`stepNum`,`userId`, `sleepTimes`,`lightSleepTimes`,`heavySleepTimes`, `wakeupNum`,`updateTime`,`createTime`) VALUES (0,0,p_stepNum, p_userId,0,0,0,0,NOW(),NOW()); ELSE -- 查看是否有用户总记录信息,不存在,则添加,否则修改 SELECT id FROM userRecord WHERE userId = p_userId LIMIT 1; SELECT FOUND_ROWS() INTO RCount; IF(RCount = 0 )THEN INSERT INTO `userRecord`(`userId`,`totalStep`,`updateTime`,`createTime`) VALUES (p_userId,p_stepNum,NOW(),NOW()); ELSE UPDATE userRecord SET totalStep = totalStep + p_stepNum WHERE userId = p_userId; END IF; -- 修改userRecordDetail UPDATE userRecordDetail SET stepNum = stepNum + p_stepNum WHERE userId = p_userId; END IF; END;// DELIMITER ; SHOW WARNINGS; SHOW CREATE PROCEDURE pro_userRecord_stepNum; CALL pro_userRecord_stepNum(1009,111); ?如果需要精确到小时,则存储过程语句如下:
#记录每天的步行、睡眠、体重、消耗卡路里等信息 #userRecordDetail 表中,如果存在当天数据,则修改,否则新增 #userRecord 表中,如果存在,则累加,否则新增 #类型:1步行2睡眠3卡路里消耗4体重 #CALL userRecord_create(1001,45,100,1000,1000,500,500,2,1); DROP PROCEDURE IF EXISTS pro_userRecord_sleep; DELIMITER // CREATE PROCEDURE pro_userRecord_sleep(IN p_userId INT, IN p_sleepTimes INT , IN p_lightSleepTimes INT , IN p_heavySleepTimes INT , IN p_wakeupNum INT) BEGIN DECLARE RCount INT; DECLARE resultId INT; -- 查看用户是否有详细记录 SELECT id INTO resultId FROM userRecordDetail WHERE userId = p_userId AND DATE_FORMAT(createTime,'%Y%m%d%H') = DATE_FORMAT(NOW(),'%Y%m%d%H') LIMIT 1; SELECT FOUND_ROWS() INTO RCount; IF (RCount=0) THEN -- 查看userRecord是否有用户总记录信息,不存在,则添加,否则修改 SELECT id FROM userRecord WHERE userId = p_userId LIMIT 1; SELECT FOUND_ROWS() INTO RCount; IF(RCount = 0 )THEN INSERT INTO `userRecord`(`userId`,