2016-10-02 2 views
0

Я тип называется sell_type определяется какфункция член, чтобы получить сумму в оракула

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

Возможно ли с помощью ПРОЦЕДУРЫ ЧЛЕНА? Если да, то как мне это достичь? –

+0

@ TharinduKuruppu .. Ты попробовал то, что сказал Алекс. Я думаю, что проблема решена. – 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

Суммирование - это агрегация, набор функция. Тип - это одно. экземпляр типа не может выполнить агрегацию во всех экземплярах своих сверстников.

Если вы хотите сделать такую ​​вещь, которую вы должны были бы объявить новый тип, с подписью, как это:

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

Спасибо, друг! Это действительно помогло. :-) –