3

と で構成されるテーブル 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$$
4

2 に答える 2

0

MySql では列名の大文字と小文字が区別されないため、where Name = name「すべての行を指定してください」という意味になる場合があります。

入力パラメーターをプロシージャ (およびクエリ内の対応する条件) に変更して、srchNameまたは別のものに変更してみてくださいname

于 2012-10-24T22:06:40.967 に答える
0

入力nameの名前を のように別の名前に変更してみてくださいinputName

更新: 別の提案。

DECLARE myid INT UNSIGNED;
SET myid = (SELECT ID FROM Processes WHERE Name=nametwo);
RETURN myid;
于 2012-10-24T22:07:58.653 に答える