2011-12-06 17 views
5

पैकेज प्रक्रिया को डीबग करना और वास्तव में डेटा होने पर कोई डेटा नहीं मिला है।ओरेकल: कोई डेटा नहीं मिला - लेकिन डेटा मौजूद है

परीक्षण बस का चयन करें

SELECT trim(trailing '/' from GL_SECURITY) as DUMMY 
FROM [email protected] 
WHERE sms_username = 'FUCHSB'; 

यह खुशी देता है मेरी मान: '23,706 * 706'

जैसे ही मैं इस का चयन किया है करने के लिए में मैं एक NO_DATA _FOUND त्रुटि (बाहर टिप्पणी की पाने की कोशिश त्रुटि हैंडलिंग मैं में डाल)

set serveroutput on 

DECLARE 
    p_BAS_user_name varchar2(20); 
    v_gl_inclusion varchar2(1000); 
    v_gl_exclusions varchar2(1000); 
BEGIN 
    --inputs 
    p_BAS_user_name := 'FUCHSB'; 
    dbms_output.put_line(p_BAS_user_name);  
----- GOOD ----- 

    --BEGIN 
     SELECT trim(trailing '/' from GL_SECURITY) as DUMMY 
     INTO v_gl_inclusion 
     FROM [email protected] 
     WHERE sms_username = p_BAS_user_name; 
    --EXCEPTION 
    -- WHEN NO_DATA_FOUND THEN 
    -- v_gl_inclusion := 'SUPER EFFING STUPID'; 
    --END;  
    dbms_output.put_line(v_gl_inclusion); 

END; 


Error report: 
ORA-01403: no data found 
ORA-06512: at line 12 
01403. 00000 - "no data found" 
*Cause:  
*Action: 
FUCHSB 

मैं तथ्य यह है कि 1 क्वेरी के आधार पर के अलावा ठीक त्रुटि पकड़ कर सकते हैं मैं 100% पता है कि एक वैल है डेटाबेस में FUCHSB के लिए।

कोई विचार .. मैं वास्तव में ओरेकल को तुच्छ करना शुरू कर रहा हूं। हां यह क्वेरी एक डेटाटाइंक पर चल रही है जैसा कि पहली क्वेरी में देखा गया डेटा है।

धन्यवाद


एसक्यूएल डेवलपर में हल अजीब व्यवहार मुझे संभावित खाली स्थान के नजरअंदाज करने का कारण:

ऐसा लगता है कि जब कर रही है जैसे कि SQL डेवलपर जब स्टैंडअलोन चयन चल रहा है अपने स्वयं के ट्रिमिंग तुलनित्र लागू होता है 'WHERE sms_username = p_BAS_user_name; ' भाग .. पैकेज में बैठे समय बाहर निकलता है .. सफेद जगह का गुच्छा इस मुद्दे का कारण बन रहा था .. अभी भी अजीब है कि यह सामान्य चयन पर लौटता है। हालांकि धन्यवाद!

+0

"व्हाइटस्पेस का गुच्छा" चार्ज डेटाटाइप का सामान्य व्यवहार है =) –

उत्तर

10

मुझे यकीन है कि मुझे इस व्यवहार का कारण मिला है: मुझे लगता है कि कॉलम वास्तव में प्रकार का प्रकार है और VARCHAR2 नहीं है।

निम्नलिखित पर विचार करें:

SQL> CREATE TABLE t (a CHAR(10)); 

Table created. 

SQL> INSERT INTO t VALUES ('FUCHSB'); 

1 row created. 

SQL> SELECT * FROM t WHERE a = 'FUCHSB'; 

A 
---------- 
FUCHSB 

SQL> DECLARE 
    2 l VARCHAR2(20) := 'FUCHSB'; 
    3 BEGIN 
    4 SELECT a INTO l FROM t WHERE a = l; 
    5 END; 
    6/
DECLARE 
* 
ERROR at line 1: 
ORA-01403: no data found 
ORA-06512: at line 4 

निष्कर्ष:

  • जब CHAR डेटाप्रकार के साथ काम करने के लिए, अपने PL/SQL चर CHAR घोषणा करते हैं।
  • जब संभव हो, तालिका कॉलम परिभाषा के लिए VARCHAR2 डेटाटाइप पसंद करें। CHAR डेटाटाइप सिर्फ एक bloated VARCHAR2 डेटाटाइप है और VARCHAR2 डेटाटाइप पर कोई सुविधा नहीं जोड़ता है (अधिक जगह/मेमोरी खपत एक सुविधा नहीं है)।
+0

वाह, अच्छा बिंदु! +1 –

+0

अच्छी जगह (और अच्छा उदाहरण)। एकमात्र चीज जो मैं आपके निष्कर्ष में जोड़ूंगा, वह पीएल/एसक्यूएल में डेटाटाइप को स्पष्ट रूप से घोषित करने से बचाना होगा, जहां इसे संभव है: l t.a% TYPE –

0

मैंने एक ही त्रुटि के लिए एक और मुद्दा देखा। लाइन xx पर त्रुटि: ORA-01403: कोई डेटा नहीं मिला ORA-06512: लाइन xx

select abc into var from table 

में क्वेरी में कोई डेटा वापस लौटाते हैं, उपरोक्त त्रुटि फेंक देते हैं।

संबंधित मुद्दे