2009-10-19 26 views
12

मैं एक pl-sql स्क्रिप्ट पर काम कर रहा हूं, जिसमें मेरे पास लगभग 10 TO_CHAR रूपांतरण हैं।क्या लाइन नंबर प्राप्त करने का कोई तरीका है जहां एक अपवाद फेंक दिया गया था?

उनमें से एक एक

ORA-06502: PL/SQL: numeric or value error: character string buffer too small 

अपवाद फेंक रहा है।

वर्तमान में

, im कोड के इस टुकड़े के साथ संदेश लॉग इन करने

EXCEPTION 
    WHEN OTHERS THEN 
    DBMS_OUTPUT.put_line('Exception message is '||SQLERRM(sqlcode)); 
    ROLLBACK; 

मैं, लाइन जहां अपवाद फेंक दिया जाता है (ज्यादातर डीबगिंग उद्देश्यों के लिए) जोड़ने के लिए में संदेश प्राप्त करना चाहते हैं

ORA-06502: PL/SQL: numeric or value error: character string buffer too small (at line x) 

क्या ऐसा करने का कोई आसान तरीका है?

उत्तर

14

आप

DBMS_OUTPUT.put_line('Error in '|| $$plsql_unit || ' at ' || $$plsql_line);

उपयोग करने के लिए 10 ग्राम की जरूरत भी

DBMS_UTILITY.format_error_backtrace

स्टीवन फ्यूरस्टीन अप्रैल '05 से Oracle पत्रिका में एक लेख है का उपयोग करते हुए इस पर गौर:

http://www.oracle.com/technetwork/issue-archive/2005/05-mar/o25plsql-093886.html

चीयर्स, निल्स

0

आप प्रत्येक अपवाद के आसपास अपना अपवाद हैंडलर डाल सकते हैं।

9

उत्तर दोनों ने $$PLSQL_LINE & DBMS_UTILITY.FORMAT_ERROR_BACKTRACE का उल्लेख किया है। लेकिन मैं उनके बीच के अंतर के बारे में थोड़ा जोड़ना चाहते हैं:

  1. Predefined Inquiry Directives$$PLSQL_LINE & $$PLSQL_UNIT
    PLSQL_LINE पूर्वनिर्धारित जांच के निर्देश एक PLS_INTEGER शाब्दिक लाइन नंबर संदर्भ का संकेत वर्तमान कार्यक्रम इकाई में PLSQL_LINE $$ पर मान है।
    इसकी परिभाषा से, PLSQL_LINE अपवाद लॉगिंग के लिए उपयुक्त नहीं है क्योंकि यह त्रुटि की लाइन संख्या के बजाय अपवाद की लाइन संख्या प्रदान करेगा। यह विशेष रूप से बड़ी प्रोग्राम इकाइयों के साथ त्रुटि स्थान का पता लगाना मुश्किल बनाता है, जब तक कि आप जेफरी के उत्तर के रूप में अपवाद हैंडलर के साथ हर कथन को लपेटें।
    हालांकि, PLSQL_LINE के बारे में अच्छी बात यह है कि यह किसी भी निष्कर्षण, या स्ट्रिंग पार्सिंग की आवश्यकता के बिना संख्या प्रदान करता है। इसलिए, यह अन्य लॉगिंग उद्देश्यों के लिए अधिक उपयुक्त हो सकता है।
  2. DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
    यह प्रक्रिया उस बिंदु पर कॉल स्टैक प्रदर्शित करती है जहां एक अपवाद उठाया गया था, भले ही प्रक्रिया को बाहरी दायरे में अपवाद हैंडलर से कहा जाता है।
    इस प्रक्रिया का उपयोग करने का लाभ यह है कि यह प्रोग्राम में सटीक रेखा संख्या प्रदान करता है जहां त्रुटि होती है, और जहां प्रक्रिया कॉल दिखाई देता है, हालांकि, प्रक्रिया ORA-XXXXX: at "<program_unit_name>", line xx जैसी स्ट्रिंग लौटाती है।इसलिए यदि आप लाइन नंबर को निकालने में रुचि रखते हैं, तो जो भी लॉगिंग उद्देश्य आप चाहते हैं, आपको स्ट्रिंग को पार्स करने की आवश्यकता होगी।

अंत में, अंतर स्पष्ट करने के लिए, नीचे एक ही सामग्री के साथ दो प्रक्रियाएं हैं। आप उन्हें चलाने के लिए और उत्पादन अंतर नोटिस कर सकते हैं

CREATE OR REPLACE PROCEDURE proc_plsql_line 
    IS 
    BEGIN 
     RAISE VALUE_ERROR; 
    EXCEPTION 
     WHEN VALUE_ERROR 
     THEN 
      DBMS_OUTPUT.put_line ('Error raised in: '|| $$plsql_unit ||' at line ' || $$plsql_line || ' - '||sqlerrm); 
    END; 
/

और

CREATE OR REPLACE PROCEDURE proc_backtrace 
    IS 
    BEGIN 
     RAISE VALUE_ERROR; 
    EXCEPTION 
     WHEN VALUE_ERROR 
     THEN 
      DBMS_OUTPUT.put_line ('Error raised: '|| DBMS_UTILITY.FORMAT_ERROR_BACKTRACE || ' - '||sqlerrm); 
    END; 
/

निष्पादन:

exec proc_plsql_line; 

Error raised in: PROC_PLSQL_LINE at line 8 - ORA-06502: PL/SQL: numeric or value error 


exec proc_backtrace; 

Error raised: ORA-06512: at "PROC_BACKTRACE", line 4 - ORA-06502: PL/SQL: numeric or value error 
+2

यह "स्वीकृत" उत्तर होना चाहिए! –

0

DBMS_UTILITY.format_error_backtrace बयान आप लाइन नंबर

begin 
select 1/0 from dual; 
exception 
    when others then 
    dbms_output.put_line('ERROR_STACK: ' || DBMS_UTILITY.FORMAT_ERROR_STACK); 
    dbms_output.put_line('ERROR_BACKTRACE: ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); 
end; 
दे देंगे
संबंधित मुद्दे

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