2

我正在尝试编写一个 PL/SQL 函数,该函数将球员的姓名作为参数,并返回在他最喜欢的体育场进行的比赛数。

如果玩家表中不存在玩家,该函数应返回 -2。如果玩家存在但他没有最喜欢的体育场,则该函数返回 -1。

这就是我所拥有的:

create or replace function favS(pname varchar2) return number
as
    fav_stadium_count number;
begin
    select count(case when favstadiums.stadium = matches.stadium then 1 else null end) into fav_stadium_count
    from favstadiums
    right join players
    on favstadiums.player = players.name
    outer join matches
    on favstadiums.stadium = matches.stadium;
    if (count(case when favstadiums.stadium = matches.stadium then 1 else null end) > 0) then
        return fav_stadium_count;
    end if;
    if players.name is null then
        return -2;
    end if;
    if (count(case when favstadiums.stadium = matches.stadium then 1 else null end) < 1) then
        return -1;
    end if;
end;

但我得到以下编译错误:

Line 9: ORA-00933: SQL command not properly ended
Line 5: SQL Statement ignored

有想法该怎么解决这个吗?

如果有帮助,这是数据库的关系图:

在此处输入图像描述

编辑(特德):

create or replace function favS(pname varchar2) return number
as
    fav_stadium_count number;
    vplayername varchar(100);
begin
    select count(case when favstadiums.stadium = matches.stadium then 1 else null end) into fav_stadium_count,
    players.name into vplayername
    from favstadiums
    right join players
    on favstadiums.player = players.name
    left outer join matches
    on favstadiums.stadium = matches.stadium
    where name = pname;
    if (fav_stadium_count > 0) then
        return fav_stadium_count;
    end if;
    if vplayername is null then
        return -2;
    end if;
    if (fav_stadium_count < 1) then
        return -1;
    end if;
end;
4

3 回答 3

3
if (count(case when favstadiums.stadium = matches.stadium then 1 else null end) > 0) then
   return fav_stadium_count;
end if;

应该只是:

if (fav_stadium_count > 0) then
   return fav_stadium_count;
end if;

至于下面的说法:

if players.name is null then
   return -2;
end if;

也是错误的。那里也没有选择语句。您应该使用某种变量fav_stadium_count来存储您想要的名称。

if (count(case when favstadiums.stadium = matches.stadium then 1 else null end) < 1) then
    return -1;
end if;

应该变成:

if (fav_stadium_count < 1) then
    return -1;
end if;
于 2013-05-31T09:29:24.347 回答
0

我认为是您的联接语法不正确。尝试:INNER JOIN 和 LEFT OUTER JOIN。执行和外部连接而不指定哪一方是错误的。

于 2013-05-31T09:42:06.917 回答
0

作为一般的设计建议,我会说这个模式缺少正确的主键——每个表都应该有一个数字 id 列,因为依赖名称等真实值的唯一性或不变性是不明智的。

然后应该打破功能,因为这段代码在一个地方做了太多。查找玩家名称的 id 可能应该在不同的函数中,如果没有找到玩家,它可以返回 null,或者可能引发错误(就像将 null 玩家名称传递给函数一样)。

我会将“查找播放器”功能分解为另一个函数,如果播放器名称不存在,则返回 null 而不是播放器 ID。

返回最喜欢的体育场的数量应该是返回一个整数,0 或更大的问题,不需要幻数来指示其他条件。

于 2013-05-31T09:46:09.567 回答