Как добавить курсор в процедуру в блоке PL/SQL?
Мне нужно создать процедуру, которая принимает первую и последнюю букву имени человека и возвращает общую стоимость и общее количество предметов, купленных им. Я понятия не имею, как использовать курсор с ним, и я думаю, что я должен использовать цикл for и обработку исключений, так как может быть много людей с одинаковыми начальными и конечными буквами.
До сих пор я придумал это:
create or replace procedure total_spent(v_fname IN
saleinv.cname%TYPE,v_lname IN saleinv.cname%TYPE.v_netspend OUT
saleinv.net%TYPE,v_totalpurch OUT NUMBER) AS
Begin
select sum(net+tax),count(net) into v_netspend,v_totalpurch from saleinv
where cname LIKE '&v_fname%&v_lname';
END;
/
ACCEPT p_fname PROMPT 'Enter The first letter of customer's name'
ACCEPT p_lname PROMPT 'Enter the last letter of customer's name'
BEGIN
totalspent('&p_fname',&'p_lname');
1 ответ
Придумали одно решение с небольшими модификациями (кстати, более конкретно с именами параметров, чтобы не было интерпретаций):
procedure total_spent(
p_fname_first_letter in varchar2,
p_lname_last_letter in varchar2,
p_netspend out number,
p_totalpurch out number) as
cursor c_net(
p_fname_first_letter varchar2,
p_lname_last_letter varchar2) is
select
sai.cname,
sum(sai.net + sai.tax) net_spend,
count(sai.net) total_purch
from
saleinv sai
where
upper(sai.cname) like upper(p_fname_first_letter) || '%' || upper(p_lname_last_letter)
group by
sai.cname;
l_found_cust boolean := false;
l_show_err boolean := false;
l_cust_list varchar2(100);
Begin
p_netspend := 0;
p_totalpurch := 0;
for l_sai_rec in c_net(
p_fname_first_letter,
p_lname_last_letter)
loop
if not l_found_cust then
p_netspend := l_sai_rec.net_spend;
p_totalpurch := l_sai_rec.total_purch;
l_cust_list := l_sai_rec.cname;
l_found_cust := true;
else
l_cust_list := l_cust_list || '; ' || l_sai_rec.cname;
l_show_err := true;
end if;
end loop;
if l_show_err then
raise_application_error(-20101, 'Found more customers with provided parameters. Customers: '||l_cust_list);
end if;
end;
Он использует курсор, как вы упомянули. Конечно, есть лучший способ сделать это без курсора, который также отвечает вашим требованиям логики (меньше кода). Если вы хотите знать, не стесняйтесь спрашивать.