我有一个表格进程,其中包含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$$
答案 0 :(得分:0)
列名在MySql中不区分大小写,因此您可能会发现where Name = name
表示“给我每一行”。
尝试将您的过程的输入参数(以及查询中的相应条件)更改为srchName
或与name
不同的其他内容。
答案 1 :(得分:0)
尝试将输入name
重命名为inputName
等其他名称。
更新:
另一个建议......
DECLARE myid INT UNSIGNED;
SET myid = (SELECT ID FROM Processes WHERE Name=nametwo);
RETURN myid;