ITPub博客

首页 > 数据库 > MySQL > mysql存储过程一例

mysql存储过程一例

原创 MySQL 作者:to_be_dba 时间:2015-12-22 00:00:41 0 删除 编辑

 

同事给的一个存储过程有点问题,测试发现" IF  date_format(sysdate(),'%H:%i:%s') > From_Time AND date_format(sysdate(),'%H:%i:%s') < End_Time THEN"

这个语句有问题。创建如下存储过程进行分析:

mysql> delimiter //

mysql> create procedure proc_t(in from_time time,in end_time time)

    -> begin

    ->  IF  date_format(sysdate(),'%H:%i:%s') > From_Time AND date_format(sysdat

e(),'%H:%i:%s') < End_Time THEN

    ->     select 'a';

    ->   else

    ->     select 'b';

    ->   end if;

    -> end //

Query OK, 0 rows affected (0.00 sec)

 

mysql> delimiter ;

该存储过程只是判断是否满足条件,执行结果是报错:

 

mysql> call proc_t('23:00:00','23:50:00');

ERROR 1267 (HY000): Illegal mix of collations (gbk_chinese_ci,COERCIBLE) and (la

tin1_swedish_ci,NUMERIC) for operation '>'

 

如果按照1267错误去找,可能就偏离答案了。实际执行的存储过程中有对该报错的处理,因此结果不符合预期,但也没有报错。

 

由于输入变量from_time和end_time都是时间类型,而比较时使用date_format(sysdate(),'%H:%i:%s')生成的是字符串,不具有可比性,造成报错。

通过time函数,将比较运算符两边修改为都是时间格式,就不会报错了:

mysql> create procedure proc_t(in from_time time,in end_time time)

    -> begin

    ->  IF  time(sysdate()) > From_Time AND time(sysdate()) < End_Time THEN

    ->     select 'a';

    ->   else

    ->     select 'b';

    ->   end if;

    -> end //

Query OK, 0 rows affected (0.00 sec)

 

mysql> delimiter ;

mysql>  call proc_t('23:00:00','23:59:00');

+---+

| a |

+---+

| a |

+---+

1 row in set (0.01 sec)

 

Query OK, 0 rows affected (0.01 sec)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26451536/viewspace-1876503/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-11-23

  • 博文量
    148
  • 访问量
    391983