0

わかりました、これは初めての試みCREATE FUNCTIONですので、ご容赦ください。

だから、私はこの(簡略化された)テーブル構造を持っています:

CREATE TABLE `pokemon` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
    `userid` INT UNSIGNED NOT NULL,
    `boxid` TINYINT UNSIGNED NOT NULL DEFAULT 255,
    `boxpos` SMALLINT UNSIGNED,
    PRIMARY KEY (`id`),
    UNIQUE KEY `position` (`userid`,`boxid`,`boxpos`)
) ENGINE=InnoDB

ユーザー ID とボックス ID を指定すると、空のボックス位置 (つまり、重複キー エラーをトリガーしないもの) を返す関数を作成したいと考えています。

boxidボックス ID には 0 ~ 249 の値を使用し、ユーザーのパーティには特別な値として 255 を使用することに注意してください。boxposボックスでは 0 ~ 45,504 の範囲で指定できますが、パーティーでは 0 ~ 5 のみです。また、パーティーでは返される位置は最初の空の位置である必要がありますが、ボックスではランダムな位置である必要があります。

したがって、これらすべてを念頭に置いて、ここに私の試みがありました:

begin
declare ret smallint unsigned;
declare exist tinyint unsigned default 1;
if fieldid = 255 then
  create temporary table `party` (
    `pos` smallint unsigned not null
  );
  insert into `party` values (0),(1),(2),(3),(4),(5);
  delete from `party` where `pos` in (select `fieldpos` from `pokemon` where `userid`=userid and `fieldid`=255);
  select `pos` into ret from `party` limit 1;
  if ret is null then select `[[Error: No room in Party]]` from `party`; end if;
else
  while exist=1 do
    set exist=0;
    set ret=floor(rand()*45504);
    select 1 into exist from `pokemon` where `fieldid`=fieldid and `userid`=userid and `fieldpos`=ret;
  end while;
end if;
return ret;
end;

(これは phpMyAdmin に入力された関数の本体であることに注意してください)

編集:問題を修正しましたDECLAREが、関数から結果セットを返すことができないと言っています。

どこで間違ったのかわかりません。正しい軌道に乗るには助けが必要だと思います。特に、そもそも関数のロジックを正しく理解できているでしょうか?

4

1 に答える 1

1

この行で:

if ret is null then select `[[Error: No room in Party]]` from `party`; end if;

テーブルからすべての行に定数値を選択しpartyますが、その選択の結果を変数に入れないでください。それがおそらくエラーの原因です。

おそらく次のようになります。

if ret is null then 
   set ret = '[[Error: No room in Party]]';
end if;

'(また、文字列リテラルは、最初から必要ではない恐ろしいバッククォートではなく、一重引用符()で囲む必要があることに注意してください。したがって、それらをすべて除外することをお勧めします)。

于 2013-01-06T09:00:40.003 に答える