mysql儲存過程一例

to_be_Dba發表於2015-12-22

 

同事給的一個儲存過程有點問題,測試發現" 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章