Mysql 存储过程中变量赋值失败

标签 mysql stored-procedures

我是 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/

相关文章:

php - 如何在仪表板中加载模块的变量

php - 我如何在 SQL SELECT LIKE 语句中搜索\r\n?

sql-server - SQL Server 自定义计数器存储过程创建欺骗

sql - 如何从 SQL 查询生成字母数字值?

php - 无法创建 MySQL 存储过程

BEGIN 后 MySQL 存储过程语法错误

php - 如何从 mysql var 生成 php echo

mysql - 教义 DQL 到 QueryBuilder

mysql - 将特定列存储和检索到包含存储过程中单行的结果集的变量中

php - MySQL 和 PHP 代码允许空表单字段数据