好的,这是我第一次尝试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
问题,但现在它说我无法从函数返回结果集。
我不确定自己哪里出错,我认为我需要帮助才能走上正轨。特别是,我首先得到了功能逻辑吗?
答案 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;
(另请注意,字符串文字需要用单引号('
)括起来,而不是那些可怕的反引号 - 首先不需要它们,因此最好将它们全部放在一起)。