【发布时间】: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