繁体   English   中英

SQL函数和匿名块

[英]SQL Function and Anonymous block

我正在上一堂关于数据库的课程。 我对此很陌生,所以如果这是一个明显的错误,请原谅,但是我已经在这个问题上工作了好几个小时了,不知道该怎么办。

该代码假定为该函数创建一个函数
A.)输出由参数(由公式(SeasonW-Seasonl)+(PlayoffW-PlayoffL)给出的一年给定的平均网赢
B.)输出所有在平均水平上有网赢的教练
C.)返回符合此条件的教练人数。
D.)有一个匿名块调用此函数,并根据函数的返回输出两个不同的消息。

现在我已经成功完成了A,C和D部分。但是由于某些原因,当我插入B部分时将无法创建我的函数。

create or replace function GOOD_COACHES(season IN INT)
return INT
IS
netwin INT;
CNT INT;
BEGIN
       --Calculated netwin
       select AVG((SEASON_WIN-SEASON_LOSS) + (PLAYOFF_WIN-PLAYOFF_LOSS)) into  netwin from COACHESSEASON where YEAR = season; 

       --Prints out A
       dbms_output.put_line('Average Netwin is: ' || netwin);

       --This Line messes up the function, I don't know why
       select T.FIRSTNAME, T.LASTNAME from COACHESSEASON T where ((T.SEASON_WIN-T.SEASON_LOSS) + (T.PLAYOFF_WIN-T.PLAYOFF_LOSS))>netwin and YEAR = season;

       --Calculates the number of teams that satisfy average
        select count(T.FIRSTNAME) into CNT from COACHESSEASON T where ((T.SEASON_WIN-T.SEASON_LOSS) + (T.PLAYOFF_WIN-T.PLAYOFF_LOSS))>netwin and YEAR = season;

return CNT;
END;
--End of the Function
--Start of the Anonymous Block
 DECLARE
      x int := GOOD_COACHES(1998);
 BEGIN
      if x = 0 then dbms_output.put_line('We didn''t find any good_coaches!');
      else dbms_output.put_line('The No. of good coaches is ' || x);
      end if;
END;
/

函数中的第三行将其弄乱了,并且不允许调用它。 如果我将其注释掉,它将正常工作。 当我从函数中删除它并使其成为常规SQL语句时,它就起作用了。

select T.FIRSTNAME, T.LASTNAME from COACHESSEASON T where ((T.SEASON_WIN-T.SEASON_LOSS) + (T.PLAYOFF_WIN-T.PLAYOFF_LOSS))>0 and YEAR = /*RandYear*/;

如果有人明白为什么不能在该行中创建该函数,那么我将不胜感激。 我也不知道如何打印函数中所选行的结果。

您没有选择T.FIRSTNAMET.LASTNAME因此该语句对于包含在PL / SQL块中无效。

可能会有多个“好教练”,因此您不能将值放入单个变量中,而必须使用游标或集合。

使用集合,如果您创建表类型以将名字和姓氏收集到:

CREATE TYPE VARCHAR2s_Table AS TABLE OF VARCHAR2(30);
/

然后,您可以使用它来收集名字和姓氏(作为奖励,收集的大小将告诉您有多少名好教练,并且您可以跳过最后一个查询):

create or replace function GOOD_COACHES(season IN INT)
return INT
IS
netwin INT;
CNT INT;
firstnames VARCHAR2s_Table;
lastnames  VARCHAR2s_Table;
BEGIN
  --Calculated netwin
  select AVG((SEASON_WIN-SEASON_LOSS) + (PLAYOFF_WIN-PLAYOFF_LOSS))
  into   netwin
  from   COACHESSEASON
  where  YEAR = season; 

  --Prints out A
  dbms_output.put_line('Average Netwin is: ' || netwin);

  --This Line messes up the function, I don't know why
  select T.FIRSTNAME, T.LASTNAME
  BULK COLLECT INTO firstnames, lastnames
  from   COACHESSEASON T
  where  ((T.SEASON_WIN-T.SEASON_LOSS) + (T.PLAYOFF_WIN-T.PLAYOFF_LOSS))>netwin
  and    YEAR = season;

  FOR i IN 1 .. firstnames.COUNT LOOP
    DBMS_OUTPUT.put_line( firstnames(i) || ' ' || lastnames(i) );
  END LOOP;

  return firstnames.COUNT;
END;
/

SQLFIDDLE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM