2017-10-12 32 views
0

嗨我已經問了一個問題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 ..

+0

參見[我的回答(https://stackoverflow.com/a/46642516/1509264)您最初的問題 - 你需要'team_rating'函數中的'WHERE'子句。我已經說過的東西從你接受的答案中缺失。 – MT0

+0

已經給你信任其他問題的答案。 – lesovren

回答

1

假設你想要得到的平均TeamScore在該團隊的GamePlayed集合中,那麼您可以在純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