#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');