2016-02-01 16 views
0

我目前已經在oracle中實現了下面的代碼。成員函數返回另一個對象中的列的總和

我正在努力創建一個成員函數來返回一個村莊的居民人數。

我該如何去做這件事,並最終創建一個匿名塊來測試,然後最終運行一個選擇語句反對它?

房屋目標

create or replace type house as object (
house_no number, 
postcode varchar2(10), 
no_of_residents number, 
member function pass(h house) return number 
); 
/

房屋目標體

create or replace type body houses_p12214840 as 
member function pass(h houses_p12214840) return number is 
begin 
    if (h.house_no=house_no) and (h.road_name=road_name) 
     and (h.postcode=postcode) 
     and (h.no_of_residents=no_of_residents) 
     then 
      return 1; 
     else 
      return 0; 
    end if; 
end; 
end; 
/

村數組類型,保持多個房屋

create or replace type village_array is varray(50) of house; 
/

我村的表

create table village (
villageid number, 
village_name varchar2(25), 
village village_array, 
PRIMARY KEY (villageid) 
); 
/

回答

0

不是絕對清楚你想要的結果(S)。

如果你只需要每個村莊所有居民的總和,你不需要成員函數(既不是「bool」[1/0])。

使用SUM功能中,而不是列的直列查詢:

SELECT T.VILLAGEID, 
     T.VILLAGE_NAME, 
     (SELECT SUM(T2.NO_OF_RESIDENTS) 
     FROM TABLE(T.HOUSES) T2) SUM_RESIDENTS 
FROM VILLAGE T; 

我用下面的例子中的一些改變:

SET SERVEROUTPUT ON; 
SET FEEDBACK OFF; 
CLEAR; 


CREATE TYPE HOUSE AS OBJECT 
(
    HOUSE_NO  NUMBER, 
    ROAD_NAME  VARCHAR2(255), 
    POSTCODE  VARCHAR2(10), 
    NO_OF_RESIDENTS NUMBER, 
    MEMBER FUNCTION PASS(H HOUSE) RETURN NUMBER 
); 
/

CREATE OR REPLACE TYPE BODY HOUSE AS 
    MEMBER FUNCTION PASS(H HOUSE) RETURN NUMBER IS 
    BEGIN 
    IF (H.HOUSE_NO = HOUSE_NO) AND (H.ROAD_NAME = ROAD_NAME) AND (H.POSTCODE = POSTCODE) AND (H.NO_OF_RESIDENTS = NO_OF_RESIDENTS) THEN 
     RETURN 1; 
    ELSE 
     RETURN 0; 
    END IF; 
    END; 
END; 
/


CREATE OR REPLACE TYPE HOUSES_ARRAY IS VARRAY(50) OF HOUSE; 
/

CREATE TABLE VILLAGE (
VILLAGEID NUMBER, 
VILLAGE_NAME VARCHAR2(25), 
HOUSES  HOUSES_ARRAY, 
PRIMARY KEY (VILLAGEID) 
); 


INSERT INTO village(VILLAGEID,VILLAGE_NAME,HOUSES) VALUES (1,'Village_1',HOUSES_ARRAY(HOUSE(1,'Road_1',12000,10),HOUSE(2,'Road_1',12000,2))); 
INSERT INTO village(VILLAGEID,VILLAGE_NAME,HOUSES) VALUES (2,'Village_2',HOUSES_ARRAY(HOUSE(1,'Road_2',12010,5),HOUSE(2,'Road_2',12010,20))); 


SELECT T.VILLAGEID, 
     T.VILLAGE_NAME, 
     (SELECT SUM(T2.NO_OF_RESIDENTS) 
     FROM TABLE(T.HOUSES) T2) SUM_RESIDENTS 
FROM VILLAGE T; 


ROLLBACK; 

DROP TABLE VILLAGE; 
DROP TYPE HOUSES_ARRAY; 
DROP TYPE HOUSE; 

輸出:

VILLAGEID VILLAGE_NAME    SUM_RESIDENTS 
---------- ------------------------- ------------- 
     1 Village_1       12 
     2 Village_2       25 

SQL> 

SELECT T.VILLAGEID, 
     T.VILLAGE_NAME, 
     SUM(T2.NO_OF_RESIDENTS) SUM_RESIDENTS 
FROM VILLAGE T, 
     TABLE(T.HOUSES) T2 
GROUP BY T.VILLAGEID, 
      T.VILLAGE_NAME 
; 

注意過多的上下文更改(SQL < - > PLSQL)。
如果你可以用SQL來完成它,可以用SQL來完成。

相關問題