【问题标题】:MySQL Function: Selecting and returning columnMySQL函数:选择和返回列
【发布时间】:2012-10-24 21:50:06
【问题描述】:

我有一个表 Processes,它由 ID (unsigned int, auto_increment)Name (varchar, unique) 组成。

使用任何输入(无论是否在表中)选择以下函数总是会导致

ERROR 1172 (42000):结果包含多于一行

CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255))
  RETURNS INT UNSIGNED
BEGIN
  DECLARE myid INT UNSIGNED;
  SELECT ID INTO myid FROM Processes WHERE Name=nametwo;
  RETURN myid;
END$$

但是,选择下面的函数总是返回 NULL:

CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255))
  RETURNS INT UNSIGNED
BEGIN
  DECLARE myid INT UNSIGNED;
  SELECT ID INTO myid FROM Processes WHERE Name=nametwo;
  RETURN myid;
END$$

此外,请注意以下确实返回了正确的结果(数字 30 和 50 是任意的):

CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255))
  RETURNS INT UNSIGNED
BEGIN
  DECLARE myid INT UNSIGNED;
  SELECT ID INTO myid FROM Processes WHERE Name=nametwo;
  IF myid IS NULL THEN
    RETURN 30;
  ELSE
    RETURN 50;
  END IF;
END$$

感谢任何帮助。

更新:已编辑以消除表列和函数参数之间的冲突。我不认为这是问题所在。

UPDATE2:请注意,无论输入参数是否在表中,以下内容似乎都有效。为什么不使用 coalesce(),即使对于表中的输入参数,该函数也会返回 NULL?

CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255))
  RETURNS INT UNSIGNED
BEGIN
  DECLARE myid INT UNSIGNED;
  SELECT ID INTO myid FROM Processes WHERE Name=nametwo;
  RETURN COALESCE(myid, 0);
END$$

【问题讨论】:

  • 尝试重命名输入参数,因为它与列名相同,避免使用不同类型的 int。使用有符号或无符号。
  • 谢谢。重命名输入参数。使声明的 var int 无符号。没有变化。
  • @iraxef 你是否也重命名了查询中的参数?
  • > 已编辑以消除表列和函数参数之间的冲突。我不相信这是问题所在。这样做就解决了我的问题,如果 C 是表列的名称并且您的函数/过程中有一个变量 C 则后者具有优先级,从而产生有趣的结果..

标签: mysql sql stored-functions


【解决方案1】:

MySql 中的列名不区分大小写,因此您可能会发现where Name = name 的意思是“给我每一行”。

尝试将您的过程(以及查询中的相应条件)的输入参数更改为srchName 或与name 不同的其他参数。

【讨论】:

    【解决方案2】:

    尝试将输入 name 重命名为不同的名称,例如 inputName

    更新: 另一个建议。

    DECLARE myid INT UNSIGNED;
    SET myid = (SELECT ID FROM Processes WHERE Name=nametwo);
    RETURN myid;
    

    【讨论】:

    • 以下仍然不起作用: DROP FUNCTION IF EXISTS LookupOrInsertProcess$$ CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255)) RETURNS INT UNSIGNED BEGIN DECLARE myid INT UNSIGNED; SELECT ID INTO myid FROM Processes WHERE Name=nametwo;返回 myid; END$$
    猜你喜欢
    • 2011-08-29
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多