функция-член для получения суммы в oracle

#oracle #plsql #oracle11g #user-defined-types

#Oracle #plsql #oracle11g #определяемые пользователем типы

Вопрос:

У меня есть тип, который называется 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) ... ? Как вы думаете, почему вы хотите (или можете иметь) функцию-член для этого, поскольку каждый экземпляр объекта не знает о других?

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

3. @TharinduKuruppu ..Ты пробовал то, что сказал Алекс. Я думаю, что ваша проблема решена.

4. Это работает, но я хочу вычислить сумму из функции.

Ответ №1:

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

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

 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, но неуклюже. Неплохо изучить синтаксис в образовательных целях, хотя бы для того, чтобы узнать его ограничения. Но в реальной жизни существует очень узкий набор вариантов использования. Реляционная модель данных — это гораздо лучший способ хранения данных.

Комментарии:

1. Спасибо, приятель! Это действительно помогло. 🙂

Ответ №2:

Это тело сделает свое дело. Но она вернет одно и то же значение для каждой строки в таблице sell. Поэтому вам нужно использовать ‘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');