Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

दोहराए गए नाम खोजने के लिए लूप के माध्यम से पार करें

इसके लिए 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 उपरोक्त कोड में यह दिखाने के लिए कार्य करें कि संग्रह में डेटा पॉप्युलेट होने के क्रम पर आपका नियंत्रण है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle पाठ में शामिल है और तकनीकी सामग्री

  2. ऑरैकल कॉलम से सभी मिलान वाली घटनाएं प्राप्त करें

  3. PL/SQL ब्लॉक से SCRIPT चलाएँ

  4. क्वेरी परिणाम अपेक्षित रूप से वापस नहीं आया

  5. जेपीए का उपयोग करते समय आप तैनाती के समय अनुक्रमों के लिए स्कीमा नाम कैसे सेट करते हैं?