之前总是在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:“`”这个符号是反单引号,两个反单引号夹起来的会被当做变量,一般是在定义字段时遇到关键字冲突的时候会用到。

