[英]How do you add cursor into a procedure in PL/SQL block?
我需要創建一個過程,該過程接受一個人名字的首字母和最后一個字母,並返回該人購買的總費用和總物品。 我不知道如何與它一起使用游標,我在想我必須使用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');
提出了一個解決方案,並進行了一些小修改(順便說一句,對參數名稱進行更具體的說明,將沒有解釋):
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;
如前所述,它使用游標。 當然,沒有游標,還有更好的方法可以滿足您的邏輯要求(更少的代碼)。 如果您願意知道,請隨時提問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.