общая сумма комиссионного вознаграждения, получаемого каждым сотрудником по продажам
Похоже, что возвращение одного числа, лишенного идентифицирующих характеристик, не является решением, которое вам нужно.Вам нужен набор результатов.Лично это выглядит лучше для представления, чем для функции, но если вы хотите обернуть запрос в функцию, вот как это сделать:
-- obviously correct these data types to fit your actual needs
create or replace type commission_t as object(
sale_id varchar2(30)
, acct_id varchar2(30)
, sale_name varchar2(48)
, total_commission_number
);
/
create or replace type commission_nt as table of commission_t;
/
create or replace FUNCTION get_total_commission return commission_nt
IS
return_value commission_nt;
begin
select commission_t(
sale_id, sale_acct,sale_name, sum(commission) )
bulk collect into return_type
from invoice_tbl invoice
join commission_tbl commission on invoice.id = commission.id
join sale_tbl sale on sale.id = commssion.id
where invoice.refnr is null
group by sale_id, sale_acct,sale_name
;
return return_value;
end get_total_commission;
И запросить его следующим образом:
select * from table (get_total_commission);
Есть разные неровности.Например, он не будет работать хорошо, если ваш набор результатов огромен (что, очевидно, зависит, но, скажем, более 5000-10000 строк).
Если вы действительно просто хотите получить общую комиссию за одну продажутогда вам нужно ограничить запрос SALE_ID - и передать его в качестве параметра:
create or replace FUNCTION get_total_commission
(p_sale_id in sale.id%type)
return number
IS
v_total_commission number;
--
begin
select
sum(commission) as total_commission
into v_total_commission
from invoice_tbl invoice
join commission_tbl commission on invoice.id = commission.id
join sale_tbl sale on sale.id = commssion.id
where sale.id = p_sale_id
and invoice.refnr is null;
return v_total_commission ;
end get_total_commission;