2016-10-02 23 views
0

我有一个名为sell_type类型定义为成员函数来获取和在Oracle

CREATE OR REPLACE TYPE sell_type AS OBJECT (
    dname VARCHAR (50), 
    car_model VARCHAR(20), 
    make VARCHAR (20), 
    price NUMBER (10,2), 
    MEMBER FUNCTION total_sales RETURN NUMBER 
); 
/

身体:

CREATE OR REPLACE TYPE BODY sell_type AS 
    MEMBER FUNCTION total_sales RETURN NUMBER IS 
    BEGIN 
     RETURN SELF.price; 
    END total_sales; 
END; 
/

和对象表

CREATE TABLE sell of Sell_Type; 
/

我想给定卖家的总销售额如下:

select s.total_sales() from sell s 
where s.dname = 'John Doe'; 

但我得到的是给定卖家的所有销售价格的单独列表,而不是这些价格的总和。

我知道我必须以某种方式修复我的字体。我试图在返回内使用SUM(),但没有奏效。有人可以帮忙吗?

+1

'select sum(s.total_sales)...'怎么了?为什么你认为你想(或可以)有一个成员函数来做到这一点 - 因为每个对象实例都不知道其他实例? –

+0

然后是否可以使用MEMBER PROCEDURE?如果是的话我将如何实现这一目标? –

+0

@ TharinduKuruppu ..你试试Alex告诉我什么。我认为你的问题已经解决。 – XING

回答

0

这个机构将做的伎俩。但是它会为销售表上的每一行返回相同的值。因此,如果只想查看一行结果,则必须使用“group by”或“max()”。

CREATE OR REPLACE 
TYPE BODY SELL_TYPE AS 
MEMBER FUNCTION total_sales (p_seller varchar2) RETURN NUMBER IS 
total_price NUMBER; 
BEGIN 
SELECT sum(s.price) INTO total_price FROM sell s where s.dname = p_seller; 
RETURN total_price; 
END total_sales; 
END; 
/

选择查询将如下所示。

select s.total_sales('John') 
from sell s GROUP BY s.total_sales('John'); 
3

求和是一个聚合,一个设置函数。一个类型是一件事; Type实例不可能在其所有对等实例上执行聚合。

如果你想要做这样的事情,你需要声明一个新的类型,像这样的签名:

CREATE OR REPLACE TYPE sell_set AS OBJECT (

    sell_items sell_type, 
    MEMBER FUNCTION total_sales (p_seller varchar2) RETURN NUMBER 

); 
/

写作体内这种类型的就留给读者做练习; - )

请注意,Oracle SQL和PL/SQL可以与OO概念一起工作,但是以笨重的方式工作。探索用于教育目的的语法是很好的,只要了解其局限性。但是在现实生活中有一些非常狭窄的用例。关系数据模型是存储数据的最佳方式。

+0

谢谢队友!这实际上有帮助。 :-) –