MySQL创建功能困难

时间:2013-01-06 08:38:24

标签: mysql

好的,这是我第一次尝试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之间的值,对用户的Party使用255作为特殊值。 Box中的boxpos范围为0到45,504,而Party中只有0到5,50。此外,在Party中,返回的位置应该是第一个空位,而在Box中它应该是一个随机位置。

所以,考虑到这一切,这是我的尝试:

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问题,但现在它说我无法从函数返回结果集。

我不确定自己哪里出错,我认为我需要帮助才能走上正轨。特别是,我首先得到了功能逻辑吗?

1 个答案:

答案 0 :(得分: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;

(另请注意,字符串文字需要用单引号(')括起来,而不是那些可怕的反引号 - 首先不需要它们,因此最好将它们全部放在一起)。