【问题标题】:PROCEDURE always return valuePROCEDURE 总是返回值
【发布时间】:2015-12-16 20:27:51
【问题描述】:

我刚刚创建了一个这样的存储过程:

delimiter $$
CREATE PROCEDURE GetSmth(IN f1 INT UNSIGNED, IN f2 VARCHAR(6))
BEGIN

   SELECT
      `ID`
   FROM
      `table`
   WHERE
         `f1`=f1
      AND
         `f2`=f2 COLLATE utf8_unicode_ci
      AND
         `f3` IS NULL
  ORDER BY `ID` DESC
  LIMIT 0, 1

END $$

这是表格中的数据:

ID | f1 |   f2   |  f3
 1 |  1 | 123456 | NULL
 2 |  1 | 555666 | 1

不管我叫什么:CALL GetSmth(3, '123456')CALL GetSmth(1, '000000') 或任何我在我的桌子上仍然得到2 作为最后一个ID 的东西。其他存储过程工作得很好。我无法弄清楚那个有什么问题。当我在没有过程的情况下调用此SELECT 语句时,它正在工作。例如,如果我将3 作为f1 值传递,我将不会得到任何结果。但在程序中它将返回2。我的定义器没问题(就像在其他程序中一样)并且SQL Data Access 设置为CONTAINS SQL - 就像在其他程序中一样。 关于表的几句话:InnoDB,ID - INT UNSIGNED AI NOT NULLf1f2 是索引INDEX(用作另一个表的外键)。此表与任何其他表一样。

【问题讨论】:

  • 您确定程序代码是您认为的那样吗?尝试SHOW CREATE PROCEDURE GetSmth 并检查。

标签: mysql stored-procedures


【解决方案1】:

使用与要在其中使用的查询中的字段名称相同的参数名称通常不是一个好主意。尝试将参数重命名为 p_f1p_f2

【讨论】:

  • 我有近 20 个其他存储过程,其中我的名称几乎相同,例如 UserFirstnameuserFirstname 作为参数。效果很好,没问题。
  • @VladislavKasianenko 你试过了吗?这不会是我第一次看到这个问题。在那些其他存储过程中,字段名称是否可能在查询中完全限定?
  • 我遇到了这个问题。我总是只使用前导下划线,例如_f1,所以它在视觉上很突出,并且不会与列名冲突。
  • 嗯,是的,它确实有效。我不知道为什么它在其他程序上工作,但在这里它不起作用。我改变了我的参数名称,它现在正在工作。谢谢。
猜你喜欢
  • 2020-04-01
  • 2020-06-12
  • 1970-01-01
  • 2013-08-25
  • 2013-01-17
  • 2018-04-08
  • 2016-07-11
  • 2018-11-10
  • 1970-01-01
相关资源
最近更新 更多