2017-12-04 5 views
0

私は2つの機能を持っています。切り捨てネストされた関数を呼び出すときの日付の値が正しくない

  1. fn_validate_date
  2. fn_validation

fn_validate_dateコード:

CREATE DEFINER=`root`@`localhost` FUNCTION `fn_validate_date`(
    `dt_date` DATE 

) 
RETURNS date 
LANGUAGE SQL 
NOT DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT 'Returns the associated value of given attribute for given employee    for a particular date.' 
BEGIN 
    SET dt_date = IF(dt_date IS NULL OR dt_date ='', CURRENT_DATE, dt_date); 
    RETURN dt_date; 
END 

fn_validationコード:今、私は以下のようfn_validate_date呼び出していたときに

CREATE DEFINER=`root`@`localhost` FUNCTION `fn_validation`(
    `dt_date` DATE 
) 
RETURNS date 
LANGUAGE SQL 
NOT DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT '' 
BEGIN 
    RETURN fn_validate_date(dt_date); 
END 
SELECT `fn_validate_date`(null); 

これはうまくいきますが、fn_validationを呼び出すとエラーになります。

SELECT `fn_validation`(null); 

enter image description here

fn_validate_dateを呼び出している間、私はエラーを取得しなかった理由私の質問はありますか?

答えて

0

fn_validate_dateでは、dt_dateパラメータは日付の型で、文字列データ型と比較しています。その必要はありません。日付データ型に ''を含めることはできません。それはNULLか、日付値を持っています。

ので、代わりの:

SET dt_date = IF(dt_date IS NULL OR dt_date ='', CURRENT_DATE, dt_date); 

あなたは、単に使用することができます。

return ifnull(dt_date, current_date()); 
+0

しかし、fn_validate_dateを呼び出すときにエラーが発生することはありません。 fn_validate_dateを呼び出すfn_validationを呼び出している間にエラーが発生しています。 – Jack

+0

関数が別の関数から呼び出されたとき、MySQLはif節を短絡しません。コードを修正するだけで大​​丈夫です。 – slaakso

+0

近い見通しでは、MySQLが文字列を短絡問題ではなく日付に変換する方法と時間の違いによく似ています。とにかく、日付と空の文字列を比較しないでください。 – slaakso

0

私はstrictモードを無効にして、それがうまく機能しています。

SET sql_mode ='' 

MySQLで厳密モードを無効にするには私はfn_validationの入力パラメータにNULLを渡しているので、なぜMySqlが短絡したIF状態になっているのか分かりません。

関連する問題