视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySql存储过程总结_MySQL
2020-11-09 19:26:24 责编:小采
文档


之前总是在MSSQL上写存储过程,没有在MYSQL上写过,也基本没有用过,今天需要用到MYSQL,研究了下,把项目的需要的存储过程写了一部分,写一下工作总结。这里没有给出数据库结构,不讨论SQL语句的细节,主要探讨存储过程语法,适合有基础的人。

发表地址:http://www.cnblogs.com/zxlovenet/p/3783136.html

#查询文章回复-- ------------------------------ Procedure structure for `sp_select_reply_article`-- ----------------------------DROP PROCEDURE IF EXISTS `sp_select_reply_article`;DELIMITER ;;CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_select_reply_article`(IN `ra_id` int,IN `pagefrom` int,IN `pagesize` int)BEGIN #Routine body goes here... SET @ra_id = ra_id; SET @pagefrom = pagefrom; SET @pagesize = pagesize; SET @ssra = CONCAT('SELECT * FROM gk_article WHERE id = ? LIMIT ?,?'); PREPARE sqlquery FROM @ssra; EXECUTE sqlquery USING @ra_id,@pagefrom,@pagesize;END;;DELIMITER ;

#技术点1:MySql5.1不支持LIMIT参数(MySql5.5就支持了),如果编写存储过程时使用LIMIT做变量,那是需要用动态SQL来构建的,而这样做性能肯定没有静态SQL好。主要代码如下:

SET @ssra = CONCAT('SELECT * FROM gk_article WHERE id = ? LIMIT ?,?');

PREPARE sqlquery FROM @ssra;

EXECUTE sqlquery USING @ra_id,@pagefrom,@pagesize;

#技术点2:如果同时需要返回受影响行数需要在语句后面添加语句:ROW_COUNT()函数,两条语句之间需要“;”分隔。

发表地址:http://www.cnblogs.com/zxlovenet/p/3783136.html

#更新数据-- ------------------------------ Procedure structure for `sp_update_permission`-- ----------------------------DROP PROCEDURE IF EXISTS `sp_update_permission`;DELIMITER ;;CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_update_permission`(IN `puser_uid` varchar(20),IN `plevel` int,IN `ppower` int)BEGIN #Routine body goes here... SET @puser_uid = puser_uid; SET @plevel = plevel; SET @ppower = ppower; UPDATE gk_permission SET `level` = @plevel, power = @ppower WHERE user_uid = CONVERT(@puser_uid USING utf8) COLLATE utf8_unicode_ci;END;;DELIMITER ;

#技术点3:MySQL进行字符串比较时发生错误(Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='),解决方法:将比较等式一边进行字符串转换,如改为“CONVERT(b.fullCode USING utf8) COLLATE utf8_unicode_ci”,主要代码如下:

UPDATE gk_permission SET `level` = @plevel, power = @ppower WHERE user_uid = CONVERT(@puser_uid USING utf8) COLLATE utf8_unicode_ci;

#插入数据-- ------------------------------ Procedure structure for `sp_insert_user`-- ----------------------------DROP PROCEDURE IF EXISTS `sp_insert_user`;DELIMITER ;;CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_insert_user`(IN `uid` varchar(20),IN `upw` varchar(32),IN `name` varchar(20),IN `sex` int,IN `phone` varchar(20),IN `u_id` int,IN `s_id` int,IN `j_id` int)BEGIN #Routine body goes here... SET @uid = uid; SET @upw = upw; SET @uname = uname; SET @sex = sex; SET @phone = phone; #由于外键约束,所以添加的外键字段需要在对应外键所在表有相应数据 SET @u_id = u_id; SET @s_id = s_id; SET @j_id = j_id; SET @verifytime = DATE('0000-00-00'); INSERT INTO gk_user(uid,upw,uname,sex,phone,u_id,s_id,j_id,verifytime) 
       VALUES(@uid,@upw,@uname,@sex,@phone,@u_id,@s_id,@j_id,@verifytime); #查询结果会自动返回受影响行数END;;DELIMITER ;

发表地址:http://www.cnblogs.com/zxlovenet/p/3783136.html

#根据ID删除数据-- ------------------------------ Procedure structure for `sp_delete_exchange_by_id`-- ----------------------------DROP PROCEDURE IF EXISTS `sp_delete_exchange_by_id`;DELIMITER ;;CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_delete_exchange_by_id`(IN `eid` int)BEGIN #Routine body goes here... SET @eid = eid; DELETE FROM gk_exchange WHERE id = @eid;END;;DELIMITER ;
#通过账号查询用户或者管理员-- ------------------------------ Procedure structure for `sp_select_user_by_uid`-- ----------------------------DROP PROCEDURE IF EXISTS `sp_select_user_by_uid`;DELIMITER ;;CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_select_user_by_uid`(IN `uid` varchar(20),IN `getAdmin` int)BEGIN #Routine body goes here... SET @uid = uid; #SET @getadmin = getAdmin; #查询管理员 IF (getAdmin = 1) THEN SELECT us.*, un.`name`, se.`name`, jo.`name`, pe.`level`, pe.power FROM gk_user AS us, gk_unit AS un, gk_section AS se, gk_jobtitle AS jo, gk_permission AS pe WHERE us.u_id = un.id AND us.s_id = se.id AND us.j_id = jo.id AND us.uid = pe.user_uid AND us.uid = CONVERT(@uid USING utf8) COLLATE utf8_unicode_ci; END IF; #查询用户 IF (getAdmin = 0) THEN SELECT us.*, un.`name`, se.`name`, jo.`name` FROM gk_user AS us, gk_unit AS un, gk_section AS se, gk_jobtitle AS jo WHERE us.u_id = un.id AND us.s_id = se.id AND us.j_id = jo.id AND us.uid = CONVERT(@uid USING utf8) COLLATE utf8_unicode_ci; END IF;END;;DELIMITER ;

#技术点4:这个存数过程需要用到控制语句(if else elseif while loop repeat leave iterate)。

IF (getAdmin = 1) THEN

#语句…

END IF;

发表地址:http://www.cnblogs.com/zxlovenet/p/3783136.html

#技术点5:在传入参数不匹配的情况下报错(Column count doesn't match value count at row 1),这个就是细心问题了,详细检查参数吧。

#技术点6:获取当前时间的函数:NOW()

#技术点7:“`”这个符号是反单引号,两个反单引号夹起来的会被当做变量,一般是在定义字段时遇到关键字冲突的时候会用到。

下载本文
显示全文
专题