mysq写存储过程中需要注意的地方
今天写了一个下午的mysql 存储过程,效率真的慢得像蜗牛。
第一 mysql存储过程跟之前写SqlServer 2005 的存储过程有点区别;
第二,用的mysql第三方企业管理器 SQLyogEnt.exe 调试的时候,写存储过程和一般的查询语句要分开的,我是后来才意识到的,气得要命(可能也是用SqlServer 2005企业管理器的编辑器的习惯导致的)。 废话少说,写存储过程,要注意如下几点:
第一 要定义DELIMITER //,意思是用//作为一段语句的结束符(这个很重要,我写的存储过程语法一点也没错,但是,就是通不过,原来分号:;分隔符是通知MySQL客户端已经输入完成的符号,而我的存储过程里边很多都有分号;结果运行的时候,就是把我一段存储过程分成很多段执行)
第二 如果你想我一样“不幸”选择了第三方mysql客户端SQLyogEnt.exe ,一定要在数据库目录里边的存储过程右键选择新建存储过程,然后在右边弹出的窗口里键入你的存储过程语句,在普通查询分析器输入无效,这是惨痛教训
第三,如果存储过程的参数如果是输入中文的话,要在定义存储过程的后面加上character set gbk这个编码,不然调用存储过程使用中文参数的时候会出错,如:
CREATE PROCEDURE CountPro(OUT a_out INT,in b_date date, in unit_name varchar(45) character set gbk)
第四,如果你的存储过程里边需要模糊查询,用到 like '%内容%' 不要在select 语句的where后边写'%';定义一个参数,用: set wherestr = "'%"+wherestr+"%'";拼接语句第五,最后要还原结束符:DELIMITER ; 为;作为语句的结束符
第五,存储过程里边定义的参数进行参数间相互赋值时,如果参数含有中文,必须定义的时候,定义编码,
如:DECLARE a varchar(10);
declare b varchar(10) ;
set a=1;
set b= a;/*这里会b会出现乱码*/
正确写法是:
declare a varchar(10) character set gbk ;
declare b varchar(10) character set gbk;
set a = '你好1';
set b= a;
select b;第六:把一个表中同列不同内容的两个元组分成两列(已经新建两个临时表),并且以这不同元组的date日期列排列,为了包括全部,需用原来的表左连接两个临时表,然后按照date分组,就能够同时包含到两个临时表的date(两个临时表间可能有交集,可能没有)
左连接的原理是,最先连接的那个表的元组都保留下来,来匹配其他连接的表,其他表这个字段没有数据就添加null上去
而union 是集合,把查询结果的两个表元组合并,而不是并排,所以要求两个表列数和列名药一致