declare
cursor cur_emploc is
                    select CRN,
                           ATTRIBUTE1, ATTRIBUTE2
                      from DCO_LOADING_ATTRIBUTES;
some_crn cur_emploc%ROWTYPE;
TYPE c_crn IS TABLE OF VARCHAR2(100);
l_crn_tab c_crn;
begin 

select CRN BULK COLLECT INTO l_crn_tab from tableau.T_DCO_CRN_FINAL_3;

OPEN cur_emploc;
  LOOP
    FETCH cur_emploc INTO some_crn;
        EXIT WHEN cur_emploc%NOTFOUND;
        IF some_crn.CRN is not null then
           IF l_crn_tab.EXISTS (some_crn.CRN) THEN
              dbms_output.put_line(some_crn.CRN);
            
         else l_error_not_search_srn:=l_error_not_search_srn||','||some_crn.CRN;  
           END IF;
        ELSE 
           insert into ... 
        END IF;
   END LOOP;
CLOSE cur_emploc;


EXCEPTION WHEN OTHERS THEN
dbms_output.put_line( SQLCODE||chr(13)||chr(10)||DBMS_UTILITY.format_error_backtrace);
END;

पंक्ति में "IF l_crn_tab.EXISTS (some_crn.CRN) तब" त्रुटि ORA-06502: वर्ण से संख्या रूपांतरण त्रुटि संख्या या मान त्रुटि

तालिका DCO_LOADING_ATTRIBUTES.CRN डेटा है: CR00000 CR000001

क्या वजह हो सकती है ? और क्या संग्रह को भरना और संग्रह के दौरान इस संग्रह तत्व की जांच करना सही है?

0
максим ильин 8 जुलाई 2021, 12:04

3 जवाब

सबसे बढ़िया उत्तर

'मौजूद' संग्रह में चेक किए गए मान की मौजूदगी की जांच करने के लिए नहीं है। इस उद्देश्य के लिए 'सदस्य'

 declare
    cursor cur_emploc is
                        select CRN,
                               ATTRIBUTE1, ATTRIBUTE2
                          from DCO_LOADING_ATTRIBUTES;
    some_crn cur_emploc%ROWTYPE;
    TYPE c_crn IS TABLE OF VARCHAR2(100);
    l_crn_tab c_crn;
    begin 
    
    select CRN BULK COLLECT INTO l_crn_tab from tableau.T_DCO_CRN_FINAL_3;
    
    OPEN cur_emploc;
      LOOP
        FETCH cur_emploc INTO some_crn;
            EXIT WHEN cur_emploc%NOTFOUND;
            IF some_crn.CRN is not null then
               IF some_crn.CRN member of l_crn_tab  THEN
                  dbms_output.put_line(some_crn.CRN);
                
               
               END IF;
            ELSE 
               dbms_output.put_line('ничего нету'); 
            END IF;
       END LOOP;
    CLOSE cur_emploc;
    
    
    --EXCEPTION WHEN OTHERS THEN
    --dbms_output.put_line( SQLCODE||chr(13)||chr(10)||DBMS_UTILITY.format_error_backtrace);
    END;
0
максим ильин 8 जुलाई 2021, 10:18

जैसा कि आपने कहा, यह त्रुटि रेखा है:

IF l_crn_tab.EXISTS (some_crn.CRN)             --> some_crn.crn = CR00000

exists विधि जांचती है कि क्या तत्व (इसे पास किया गया) मौजूद है, लेकिन तत्व एक NUMBER (पहला तत्व, दूसरा, पचासवां, ...) के रूप में है।

संग्रह में nth तत्व मौजूद होने पर EXISTS(n) TRUE लौटाता है। अन्यथा, EXISTS(n) FALSE लौटाता है। मुख्य रूप से, आप विरल नेस्टेड तालिकाओं को बनाए रखने के लिए EXISTS के साथ DELETE का उपयोग करते हैं। जब आप किसी गैर-मौजूद तत्व का संदर्भ देते हैं तो अपवाद को बढ़ाने से बचने के लिए आप EXISTS का भी उपयोग कर सकते हैं। एक आउट-ऑफ-रेंज सबस्क्रिप्ट पारित होने पर, EXISTS SUBSCRIPT_OUTSIDE_LIMIT बढ़ाने के बजाय FALSE लौटाता है।

आप एक स्ट्रिंग पास कर रहे हैं, उदा। सीआर0000. Oracle इसे किसी संख्या में परोक्ष रूप से परिवर्तित करने में असमर्थ है, इसलिए यह एक त्रुटि उत्पन्न करता है।

अब, सवाल यह है कि आप वास्तव में यहां क्या जांच रहे हैं, इसलिए समाधान इस पर निर्भर करता है।

2
Littlefoot 8 जुलाई 2021, 10:23

पंक्ति में "IF l_crn_tab.EXISTS (some_crn.CRN) तब" त्रुटि ORA-06502: वर्ण से संख्या रूपांतरण त्रुटि संख्या या मान त्रुटि

मौजूद है(n), जहां n -- एलिमेंट का इंडेक्स पूर्णांक के रूप में।

1
Krasnoslobodtsev Sergei 8 जुलाई 2021, 10:27