と で構成されるテーブル Processes がありID (unsigned int, auto_increment)
ますName (varchar, unique)
。
次の関数を任意の入力 (表にあるかどうかに関係なく) で選択すると、常に次の結果になります。
エラー 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$$