2016-10-13 5 views
0

MySQLストアドプロシージャの新機能です。私はsqlWhereというローカル変数のいくつかの代入を行いました。最初の4つの割り当てはうまくいきます。他はしません。 5番目の割り当てsqlWhereからはnullになります。割り当ては以下の通りです:ストアドプロシージャでMysql変数のアラインメントが失敗する

IF datePosePrevueSup IS NOT NULL THEN 
    SET SQL_WHERE_DATE_POSE_PREVUE_SUP = replace(SQL_WHERE_DATE_POSE_PREVUE_SUP, ':datePosePrevueSup', DATE_FORMAT(datePosePrevueSup, FORMAT_DATE)) ; 
    SET sqlWhere = concat(sqlWhere, IF(sqlWhere = '', '', ' AND '), SQL_WHERE_DATE_POSE_PREVUE_SUP) ; 
END IF ; 

sqlwhereと大文字の変数は、十分な部屋で宣言されている...

誰でも助けることができますか?

おかげ

+0

auto_inc – Drew

+0

のテーブルを挿入すると、デバッグが容易になります。連結の値を出力します.1つはnullになります –

答えて

0

私はこれをデバッグする手順を説明するつもりですので、あなた自身で事のこのタイプをデバッグすることができることが、将来の可能性が高くなります。

http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_concatは言う:いずれかの引数がNULLである場合

CONCAT()はNULLを返します。

これを常に心がけてください。 CONCAT()のいずれかの引数がNULLの場合、返される文字列全体はNULLです。したがって、sqlWhereがNULLになると、CONCAT()の引数の1つがおそらくNULLになります。

CONCAT()にあなたの呼び出しの引数は、次のとおりです。以前のコードから

  • sqlWhere。これはNULLではないことをテストしました。

  • IF(sqlWhere = '', '', ' AND ')これはかなり単純です。文字列定数を返すことができるだけなので、NULLにすることはできません。

  • SQL_WHERE_DATE_POSE_PREVUE_SUP

なるほど。今どこかに行ってきます。その最後の変数はNULLである可能性が最も高い原因です。その変数の値はどのように設定されていますか?

SET SQL_WHERE_DATE_POSE_PREVUE_SUP = replace(
    SQL_WHERE_DATE_POSE_PREVUE_SUP, 
    ':datePosePrevueSup', 
    DATE_FORMAT(datePosePrevueSup, FORMAT_DATE) 
) ; 

REPLACE()は、引数がNULLの場合はNULLも返すことに注意してください。ドキュメントには、このことを言及していないが、我々はいくつかのアドホックテストでそれを確認することができます

mysql> select replace('foo bar baz', 'foo', null); 
+-------------------------------------+ 
| replace('foo bar baz', 'foo', null) | 
+-------------------------------------+ 
| NULL        | 
+-------------------------------------+ 
1 row in set (0.01 sec) 

mysql> select replace(null, 'foo', 'FOO'); 
+-----------------------------+ 
| replace(null, 'foo', 'FOO') | 
+-----------------------------+ 
| NULL      | 
+-----------------------------+ 
1 row in set (0.00 sec) 

mysql> select replace('foo bar baz', NULL, 'FOO'); 
+-------------------------------------+ 
| replace('foo bar baz', NULL, 'FOO') | 
+-------------------------------------+ 
| NULL        | 
+-------------------------------------+ 

だから今、私たちはこれが可能である知っていることを、引数のおそらく1あなたREPLACE()式にNULLです。議論は何ですか?

  • SQL_WHERE_DATE_POSE_PREVUE_SUPこれはテストしましたか?
  • ':datePosePrevueSup'はNULLではない文字列リテラルです。
  • DATE_FORMAT(datePosePrevueSup, FORMAT_DATE)はNULLを返すことがあります。あなたは両方の変数をテストしましたか?

私たちは、そのいずれかの引数がNULLである場合DATE_FORMAT()もNULLを返すことを確認することができます

mysql> select date_format('2016-12-18', NULL); 
+---------------------------------+ 
| date_format('2016-12-18', NULL) | 
+---------------------------------+ 
| NULL       | 
+---------------------------------+ 

mysql> select date_format(null, '%x, %v'); 
+-----------------------------+ 
| date_format(null, '%x, %v') | 
+-----------------------------+ 
| NULL      | 
+-----------------------------+ 

うまくいけば、これはあなたの将来に自分でこの問題をデバッグするためのいくつかのテクニックを示しています。

関連する問題