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

संग्रह में हेरफेर

कम से कम आपने दूसरे मामले में टेबल परिभाषा खो दी है। यह कथन:

create or replace TYPE tbl_list2 IS OBJECT (l_owner  VARCHAR2(64),l_name  VARCHAR2(64));

केवल वस्तु (या रिकॉर्ड) प्रकार घोषित करता है, तालिका नहीं।

तो आपको इसे 2 चरणों में करना होगा:

create or replace TYPE tbl_list_rec IS OBJECT (l_owner  VARCHAR2(64),l_name  VARCHAR2(64));
/

create or replace TYPE tbl_list2 as table of tbl_list_rec;
/

उसके बाद आपको स्क्रिप्ट में कुछ सिंटैक्स सुधारों की आवश्यकता है:

declare
  l_object tbl_list2;
  i        number;
begin
  -- for list initialization it must be filled with constructed objects
  l_object := tbl_list2( tbl_list_rec('','') );

  for i in 1..100000 loop          

    -- 1. select values to variable
    -- 2. Fix constructor for list 
    select 
      l_object MULTISET UNION DISTINCT tbl_list2(tbl_list_rec('myOwner','MyTable'))
    into 
      l_object 
    from 
      dual;

    end loop;

    for i in l_object.first ..  l_object.last loop
      -- output separate fields, there are now default conversion from 
      -- user-defined objects to varchar2.
      dbms_output.put_line(l_object(i).l_owner || ',' || l_object(i).l_name);
    end loop;  

end;
/

अपडेट करें

बड़ी संख्या में संदर्भ स्विच की वजह से समाधान अपेक्षाकृत धीमा है। लेकिन जटिल वस्तु प्रकार के उदाहरणों की तुलना बिना कुछ अतिरिक्त काम के सीधे PL/SQL में नहीं की जा सकती है। noopener" href="https://docs.oracle.com/cd/B28359_01/appdev.111/b28371/adobjbas.htm#i460525">ऑब्जेक्ट प्रकार के लिए मैपिंग या ऑर्डरिंग विधि . दोनों प्रकार की विधियों की अनुमति नहीं है, इसलिए उचित एक को चुनने की आवश्यकता है। MAP विधियां तेजी से काम करती हैं और हमारे मामले में आदेश देने की कोई आवश्यकता नहीं है, इसलिए इसके लिए जाएं:

create or replace TYPE tbl_list_rec2 AS OBJECT (
  l_owner  VARCHAR2(64),
  l_name  VARCHAR2(64),
  map member function get_key return varchar2
);
/

कार्यान्वयन:

create or replace TYPE BODY tbl_list_rec2 AS 

  map member function get_key return varchar2
  is
  begin
    return l_owner||chr(1)||l_name;
  end;

end;
/

उसके बाद पीएल/एसक्यूएल कोड में समानता के लिए वस्तुओं का परीक्षण करना संभव है जैसे सरल varchar2 प्रश्न से पहले उदाहरण में:

declare
  l_object tbl_list2a;
  i        number; 
begin
  l_object := tbl_list2a( tbl_list_rec2('','') );

  for i in 1..100000 loop          
    l_object := l_object MULTISET UNION DISTINCT tbl_list2a(tbl_list_rec2('myOwner','MyTable'));
  end loop;

  for i in l_object.first..  l_object.last loop
    dbms_output.put_line(l_object(i).l_owner || ',' || l_object(i).l_name);
  end loop;  

end;
/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटाबेस कनेक्शन और क्वेरी कोड के साथ मदद चाहिए

  2. Oracle के डंप (सिस्टिमस्टैम्प) बाइट्स का अर्थ

  3. Oracle - एक varchar कॉलम में to_number फ़ंक्शन को लागू करना

  4. TOAD के साथ Oracle 11g की अलग-अलग तिथियां

  5. Oracle इंस्टेंट क्लाइंट और Oracle क्लाइंट के बीच अंतर