Mysql变量在存储过程中失败

时间:2016-10-13 15:18:59

标签: mysql stored-procedures

我是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和大写变量已被宣布有足够的空间......

有人可以帮忙吗?

由于

1 个答案:

答案 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)

希望这能为您展示一些在将来自行调试此问题的技巧。