इसके लिए PL/SQL में लूप के भीतर लूप न करें - उपयोग के लिए तैयार डेटा देने के लिए SQL का उपयोग करें।
पहले हम कुछ परीक्षण डेटा के साथ आपकी तालिका बनाते हैं (मैं डेटाटाइप का अनुमान लगा रहा हूं - आप अपने स्वयं के साथ प्रतिस्थापित करते हैं):
create table product_master (
product_no varchar2(10)
, product_holder varchar2(10)
, product_catalogue varchar2(10)
)
/
insert into product_master values ('1', 'SMITH', 'TEMP')
/
insert into product_master values ('2', 'SMITH', 'TEMP')
/
insert into product_master values ('3', 'HARRY', 'ARCH')
/
insert into product_master values ('4', 'TOM' , 'DEPL')
/
commit
/
हम mail_send
को क्या भेजना चाहते हैं प्रत्येक product_holder
. के लिए प्रक्रिया एक संग्रह (सरणी) है जिसमें product_no
. है और product_catalogue
. तो पहले एक प्रकार जिसमें वे दो तत्व शामिल हैं:
create type t_prod_cat_no as object (
product_no varchar2(10)
, product_catalogue varchar2(10)
)
/
और फिर उस प्रकार का एक नेस्टेड तालिका प्रकार (संग्रह प्रकार):
create type t_prod_cat_no_table as
table of t_prod_cat_no
/
प्रक्रिया mail_send
फिर product_holder
को स्वीकार करना चाहिए और संग्रह प्रकार:
create or replace procedure mail_send (
p_parameter in varchar2
, p_product_holder in varchar2
, p_product_cats_nos in t_prod_cat_no_table
)
is
begin
dbms_output.put_line('-- BEGIN '||p_parameter||' --');
dbms_output.put_line('Dear '||p_product_holder);
dbms_output.put_line('Your products are:');
for i in 1..p_product_cats_nos.count loop
dbms_output.put_line(
'Catalogue: '||p_product_cats_nos(i).product_catalogue||
' - No: '||p_product_cats_nos(i).product_no
);
end loop;
end mail_send;
/
(मैं मेल बनाने का अनुकरण करने के लिए सिर्फ dbms_output का उपयोग करता हूं।)
फिर आप SQL में एक group by product_holder
. कर सकते हैं और SQL को डेटा युक्त संग्रह उत्पन्न करने दें:
begin
for holder in (
select pm.product_holder
, cast(
collect(
t_prod_cat_no(pm.product_no,pm.product_catalogue)
order by pm.product_catalogue
, pm.product_no
) as t_prod_cat_no_table
) product_cats_nos
from product_master pm
group by pm.product_holder
order by pm.product_holder
) loop
mail_send(
'PRODMASTER'
, holder.product_holder
, holder.product_cats_nos
);
end loop;
end;
/
उपरोक्त ब्लॉक का आउटपुट होगा:
-- BEGIN PRODMASTER --
Dear HARRY
Your products are:
Catalogue: ARCH - No: 3
-- BEGIN PRODMASTER --
Dear SMITH
Your products are:
Catalogue: TEMP - No: 1
Catalogue: TEMP - No: 2
-- BEGIN PRODMASTER --
Dear TOM
Your products are:
Catalogue: DEPL - No: 4
इसे SQL में GROUP BY
. के साथ करना आपको PL/SQL से SQL तक एक ही कॉल में सब कुछ देता है, जो कि product_holder
के विशिष्ट सेट को प्राप्त करने के लिए पहली कॉल की तुलना में बहुत अधिक कुशल है। , उस पर लूप करें, और फिर प्रति product_holder
. पर एक कॉल करें प्रत्येक धारक के लिए उत्पाद प्राप्त करने के लिए।
अद्यतन:
जोड़ा गया order by
collect
उपरोक्त कोड में यह दिखाने के लिए कार्य करें कि संग्रह में डेटा पॉप्युलेट होने के क्रम पर आपका नियंत्रण है।