MySQL 在版本 5.X 之后才有了存储过程,虽然大体上和 SQL Server 差不多,但有些细节的地方,写法上差别还是比较大。如果对存储过程不了解,而且想学学基本知识的朋友,可以看看《MySQL5.x.x存储过程简单入门》,也是最近刚学存储过程时的笔记,非常基础的部分,想入门的朋友可以参考。
由于原来项目有个存储过程是 SQL Server 的,但需要搬到 MySQL 中运行,有些地方需要修改,下面就主要修改的一些地方做一下比较,列出来吧,供大家参考(文章中,MS 代表 MySQL,SS 代表 SQL Server,(a) 代表 @):
1. 在变量的声明和赋值上的差别。
SS 中,变量要先声明后赋值,局部变量用一个(a)标识,全局变量用两个(a)。
SS 声明局部变量语法:
- declare (a)变量名1 数据类型1,(a)变量名2 数据类型2;
- declare (a)变量名3 数据类型3,...
- 例如:declare (a)method char(10),(a)COUNT INT;
- DECLARE (a)starttime DATETIME,...
注意:声明的方式和 MS 有区别,一个 declare 可以声明很多个变量,并用逗号分割,最后用分号,才可以写下一个 declare。另外,变量名前有(a)。
SS 有两种赋值方法((a)num为变量名,value为值):
- set (a)num=value;
- 或
- select (a)num=value;
SS 如果想获取查询语句中的一个字段的值赋值于某变量,则可以用 select 给变量赋值:
select (a)num=字段名 from 表名 where...
而在 MS 中,变量不用提前声明,当用的时候直接用“(a)变量名”就可以了。但如果想声明,也可以用关键字 declare来先声明。
MS 声明局部变量语法:
- declare 变量名1 数据类型1;declare 变量名2 数据类型2;declare 变量名3 数据类型3;...
- 例如:declare method char(10);DECLARE COUNT INT;DECLARE starttime DATETIME;...
注意:声明的写法和 SS 是不同的。没有(a),很多个 declare,每个之间用分号分割。当然也可以不用声明,直接按下面的赋值方式运用变量也行。
MS 赋值局部变量语法:
- set (a)num=1;
- 或
- set (a)num:=1;
- select (a)num:=1;
- 或
- select (a)num:=字段名 from 表名 where...
注意:使用 set 时赋值符号可以用“=”或“:=”,而使用 select 时必须用“:=”。
2. IF 判断上的区别。
SS 在用 IF 条件判断语句时,有个 IF 则足够了,看下例:
- if (a)limit_c is null
- select (a)limit_c = 0
但在 MS 中,还需要有 THEN 做连接,并用 END IF 加分号做结尾。
- IF (a)limit_c IS NULL
- THEN
- SELECT (a)limit_c := 0;
- END IF;
3. 同上,IF ... ELSE ...,IF .. ELSE IF ... ELSE ...。
- SS:
- IF ... ELSE ...
- IF ... ELSE IF ... ELSE ...(else 和 if 中间有空格)
- MS:
- IF ... THEN ... ELSE ... END IF;
- IF ... THEN ... ELSEIF ... THEN ... ELSE ... END IF;(else 和 if 中间无空格)
4. 动态执行 sql 的命令 EXECUTE 的区别。
- SS:
- exec p_getmonthfrist (a)starttime,(a)starttime output
- MS:
- EXECUTE p_getmonthfrist USING (a)starttime,(a)starttime;
这里只是修改存储过程时碰到的几个不同点,大概整理总结一下,但肯定是九牛一毛,一定还有很多写法大不相同的的地方,只能上网多查查了。
也不知道为啥,代码中有@时,发布博客有下面的警告信息,烦的很。
- 由于您访问的URL有可能对网站造成安全威胁,您的访问被阻断。
- 站长点击查看详情
- 规则ID:1020 拦截时间:2015/03/02 15:05:06
- ServerName:chn-tj-ht-sa1/1.2.9-3
- 进入站长绿色通道 - 使您的访问不再被拦截
查了下,问题没解决了,就用(a)代替了代码中的@,就凑合看吧。。。