我是MySQL存储过程的新手。我做了几个名为sqlWhere
的局部变量的赋值。前4个任务运作良好。其他人没有。从第5个作业sqlWhere
变为空。作业如下:
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 :(得分:0)
我将解释调试此步骤的步骤,因此您将来更有可能自行调试此类事情。
http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_concat说:
如果任何参数为NULL,则
CONCAT()
返回NULL。
始终牢记这一点。如果CONCAT()
的任何参数为null,则返回的整个字符串为NULL。因此,如果sqlWhere
变为NULL,则CONCAT()
的其中一个参数可能为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,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 |
+-------------------------------------+
也会返回NULL。文档没有提到这一点,但我们可以通过一些临时测试来确认:
REPLACE()
现在我们知道这是可能的,也许你的SQL_WHERE_DATE_POSE_PREVUE_SUP
表达式的一个参数是NULL。有什么争论?
':datePosePrevueSup'
可能为NULL,您测试过吗?DATE_FORMAT(datePosePrevueSup, FORMAT_DATE)
是一个非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 |
+-----------------------------+
的任何参数为NULL,我们可以确认windowStyle = new Window.WindowStyle(boldFont, Color.WHITE, drawable);
dialog = new Dialog("Error", windowStyle);
dialog.getContentTable().add(resetButton);
也返回NULL:
dialog.show(stage)
希望这能为您展示一些在将来自行调试此问题的技巧。