2011-06-14 14 views
8

में विशिष्ट वर्चर खोजें I पीएल-एसक्यूएल के लिए नया हूं, और संचालन के स्पष्ट दस्तावेज़ीकरण को खोजने के लिए संघर्ष करना घोंसला वाली टेबल हैं। कृपया किसी भी दुरुपयोग शब्दावली इत्यादि को सही करेंओरेकल नेस्टेड टेबल

मेरे पास एक नेस्टेड टेबल प्रकार है जिसे मैं संग्रहीत प्रक्रिया के लिए पैरामीटर के रूप में उपयोग करता हूं।

CREATE OR REPLACE TYPE "STRARRAY" AS TABLE OF VARCHAR2 (255) 

मेरी संग्रहीत प्रक्रिया में, तालिका प्रारंभ और पॉप्युलेट की जाती है। मान लें कि मेरे पास VARCHAR2 चर है, और अगर मैं वर्चर्ड टेबल में वर्चर मौजूद हूं तो मैं सच या गलत जानना चाहता हूं।

मैं

strarray.exists('somevarchar') 

कोशिश की, लेकिन मैं एक ORA-6502 प्राप्त

वहाँ क्या पुनरावृत्ति के अलावा अन्य है कि करने के लिए एक आसान तरीका है?

FOR i IN strarray.FIRST..strarray.LAST 
    LOOP 
     IF strarray(i) = value THEN 
      return 1;--found 
     END IF; 
    END LOOP; 

उत्तर

8

एकल मान की जांच के लिए मैं "सदस्य" ऑपरेटर पसंद करते हैं।

[email protected]> declare 
     2  enames  strarray; 
     3  wordToFind varchar2(255) := 'King'; 
     4 begin 
     5  select emp.last_name bulk collect 
     6  into enames 
     7  from employees emp; 
     8  if wordToFind member of enames then 
     9   dbms_output.put_line('Found King'); 
    10  end if; 
    11 end; 
    12/

Found King 

PL/SQL procedure successfully completed 

[email protected]> 
5

आप निर्धारित करने के लिए स्ट्रिंग में आपकी रुचि है संग्रह में मौजूद है मल्टीसेट INTERSECT ऑपरेटर का उपयोग कर सकते हैं। उदाहरण के लिए

declare 
    l_enames strarray; 
    l_interesting_enames strarray := new strarray('KING'); 
begin 
    select ename 
    bulk collect into l_enames 
    from emp; 
    if(l_interesting_enames = l_interesting_enames MULTISET INTERSECT l_enames) 
    then 
    dbms_output.put_line('Found King'); 
    end if; 
end; 

स्ट्रिंग "किंग" l_enames संग्रह का तत्व है, तो "मिला राजा" प्रिंट करेगा।

3

यदि आप यह निर्धारित करना चाहते हैं कि यह तत्व संग्रह में मौजूद है या नहीं, तो आपको exists पर एक सरणी मान नहीं, एक सरणी अनुक्रमणिका पास करनी चाहिए। नेस्टेड टेबल को पूर्णांक द्वारा अनुक्रमित किया जाता है, इसलिए स्ट्रिंग द्वारा संदर्भित करने का कोई तरीका नहीं है।

हालांकि, यदि आप स्ट्रिंग इंडेक्स द्वारा अपने सरणी तत्व को संदर्भित करना चाहते हैं तो आप संग्रह के बजाय सहयोगी सरणी देखना चाहेंगे। यह इस तरह दिखेगा:

DECLARE 
    TYPE assocArray IS TABLE OF VARCHAR2(100) INDEX BY VARCHAR2(100); 
    myArray assocArray; 
BEGIN 

    myArray('foo') := 'bar'; 

    IF myArray.exists('baz') THEN 
    dbms_output.put_line(myArray('baz')); 

    ELSIF myArray.exists('foo') THEN 
    dbms_output.put_line(myArray('foo')); 

    END IF; 

END; 

मूल रूप से, अगर आपके सरणी मूल्यों अलग हैं, तो आप बनती सरणियों एक दूसरे को, की तरह संदर्भित बना सकते हैं, arr('b') := 'a'; arr('a') := 'b';

इस तकनीक को आसानी से किसी भी तत्व को देखने के लिए आप मदद कर सकता है और इसकी अनुक्रमणिका।

3

जब कोई नेस्टेड टेबल स्कीमा-स्तरीय प्रकार के रूप में घोषित किया जाता है, जैसा आपने किया है, तो इसे किसी भी SQL क्वेरी में तालिका के रूप में उपयोग किया जा सकता है। तो तुम इतनी तरह एक साधारण समारोह लिख सकते हैं:

CREATE OR REPLACE FUNCTION exists_in(str VARCHAR2, tab stararray) 
    RETURN BOOLEAN 
    AS 
    c INTEGER; 
    BEGIN 
    SELECT COUNT(*) 
     INTO c 
     FROM TABLE(CAST(tab AS strarray)) 
     WHERE column_value = str; 
    RETURN (c > 0); 
    END exists_in; 
संबंधित मुद्दे