我是 MySQL 存储过程的新手。我对名为 sqlWhere
的局部变量进行了多次赋值。前 4 个作业效果很好。其他人则不然。从第 5 个赋值开始,sqlWhere
变为 null。任务如下:
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
和大写变量已声明为有足够的空间...
有人可以帮忙吗?
谢谢
最佳答案
我将解释调试此问题的步骤,以便您将来更有可能能够自己调试此类内容。
http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_concat说:
CONCAT()
returns NULL if any argument is 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)
) ;
请注意,如果任何参数为 NULL,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 |
+-------------------------------------+
现在我们知道这是一种可能性,也许您的 REPLACE()
表达式的参数之一是 NULL。论点是什么?
SQL_WHERE_DATE_POSE_PREVUE_SUP
可能为 NULL,您测试过吗?':datePosePrevueSup'
是一个不为 NULL 的字符串文字。DATE_FORMAT(datePosePrevueSup, FORMAT_DATE)
可能会返回 NULL。您测试过这两个变量吗?
我们可以确认,如果 DATE_FORMAT()
的任何参数为 NULL,它也会返回 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 |
+-----------------------------+
希望这向您展示了一些将来自行调试此问题的技巧。
关于Mysql 存储过程中变量赋值失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40024955/