【问题标题】:Method Function not getting values from single row (Nested table)方法函数未从单行获取值(嵌套表)
【发布时间】:2017-10-12 10:41:08
【问题描述】:

您好,我问了一个问题related to this already,但还有第二个问题。我评论说我制作了一个嵌套表格,其中包含参加比赛的球队,而不是为每个球队和得分分开行。

我想为特定的 GameId 而不是表中的所有行运行方法。这次我已经包含了我的 Game_Type 对象,尽管我认为上次没有必要。

CREATE TYPE Game_Type AS OBJECT
(GameId NUMBER)
/
CREATE TABLE Game_Table of Game_Type
/
INSERT INTO Game_Table 
VALUES (1)
/
INSERT INTO Game_Table
VALUES (2)
/
CREATE TYPE Team_Type AS OBJECT
(TeamPlayed VARCHAR2(30),
TeamScore NUMBER(1))
/

CREATE TYPE TeamsPlayed_Table as TABLE OF Team_Type
/
CREATE OR REPLACE TYPE After_Team AS OBJECT
(GameRef REF Game_Type,
GamePlayed Teamsplayed_Table,
MAP MEMBER FUNCTION team_rating RETURN NUMBER)
/
CREATE TABLE Team_Table of After_Team NESTED TABLE GamePlayed STORE AS 
GamePlayed_Nested
/
CREATE OR REPLACE TYPE BODY After_Team
AS
MAP MEMBER FUNCTION team_rating
  RETURN NUMBER
IS 
avg_score NUMBER;
BEGIN
SELECT AVG(c.TeamScore)
INTO avg_score
FROM Team_Table d, table(d.GamePlayed) c;
RETURN avg_score;
END;
END;
/

INSERT INTO Team_Table 
VALUES((SELECT REF(a) FROM Game_Table a WHERE a.gameid = 1), 
(TeamsPlayed_Table(Team_Type('Team A', 1), Team_Type('Team B', 3))))
/

INSERT INTO Team_Table 
VALUES((SELECT REF(a) FROM Game_Table a WHERE a.gameid = 2), 
(TeamsPlayed_Table(Team_Type('Team C', 5), Team_Type('Team D', 9))))
/

现在当我执行我的方法时:

SELECT t.team_rating()
from Team_Table t
where t.GameRef.GameId = 1

它返回所有值的平均值,而不仅仅是第 1 场比赛。

【问题讨论】:

  • 请参阅 my answer 到您的初始问题 - 您需要在 team_rating 函数中使用 WHERE 子句。您接受的答案中缺少我已经说过的内容。
  • 已将其他问题的答案归功于您。

标签: sql oracle plsql


【解决方案1】:

假设您想获得该团队 GamePlayed 集合中 TeamScore 的平均值,那么您可以在纯 PL/SQL 中完成(无需上下文切换到 SQL 范围):

CREATE OR REPLACE TYPE BODY After_Team
AS
  MAP MEMBER FUNCTION team_rating
    RETURN NUMBER
  IS 
    avg_score NUMBER := 0;
    j INTEGER := 0;
  BEGIN
    FOR i IN 1 .. self.GamePlayed.COUNT LOOP
      IF self.GamePlayed(i) IS NOT NULL AND self.GamePlayed(i).TeamScore IS NOT NULL THEN
        avg_score := avg_score + self.GamePlayed(i).TeamScore;
        j := j + 1;
      END IF;
    END LOOP;
    IF j > 0 THEN
      RETURN avg_score / j;
    ELSE
      RETURN NULL;
    END IF;
  END;
END;
/

SQLFIDDLE

否则,您可以使用:

CREATE OR REPLACE TYPE BODY After_Team
AS
  MAP MEMBER FUNCTION team_rating
    RETURN NUMBER
  IS 
    avg_score NUMBER;
  BEGIN
    SELECT avg( TeamScore )
    INTO   avg_score
    FROM   TABLE( self.GamePlayed );

    RETURN avg_score;
  END;
END;
/

SQLFIDDLE

【讨论】:

    猜你喜欢
    • 2020-12-14
    • 1970-01-01
    • 2020-05-05
    • 2014-08-27
    • 2019-08-20
    • 1970-01-01
    • 2011-06-08
    • 2020-02-18
    • 1970-01-01
    相关资源
    最近更新 更多