2011-10-14 21 views
10

मुझे लगता है कि वर्तमान में MySQL में उपलब्ध कुछ भी नहीं है जो कि MySQL संग्रहीत प्रक्रिया के भीतर अंतिम निष्पादित कथन के SQLSTATE तक पहुंच की अनुमति देता है। इसका मतलब यह है कि जब एक संग्रहित प्रक्रिया के भीतर एक सामान्य SQLException उठाया जाता है तो त्रुटि की सटीक प्रकृति को प्राप्त करना मुश्किल/असंभव होता है।MySQL संग्रहीत प्रक्रिया त्रुटि

क्या किसी के पास MySQL संग्रहीत प्रक्रिया में त्रुटि के SQLSTATE को प्राप्त करने के लिए कोई कामकाज है जिसमें प्रत्येक संभावित SQLSTATE के लिए हैंडलर घोषित करने में शामिल नहीं है?

उदाहरण के लिए - कल्पना करें कि मैं एक ERROR_STATUS कि निम्नलिखित में जेनेरिक "इस BEGIN....END ब्लॉक में कहीं हुआ SQLException" परे चला जाता है वापस जाने के लिए कोशिश कर रहा हूँ:

DELIMITER $$ 

CREATE PROCEDURE `myProcedure`(OUT o_error_status varchar(50)) 
MY_BLOCK: BEGIN 

DECLARE EXIT handler for 1062 set o_error_status := "Duplicate entry in table"; 
DECLARE EXIT handler for 1048 set o_error_status := "Trying to populate a non-null column with null value"; 
-- declare handlers ad nauseum here.... 

DECLARE EXIT handler for sqlexception set o_error_status:= "Generic SQLException. You'll just have to figure out the SQLSTATE yourself...." ; 

-- Procedure logic that might error to follow here... 

END MY_BLOCK$$ 

किसी भी सुझाव दिए गए?

पी एस मैं चला रहा हूँ MySQL 5.1.49

उत्तर

7

प्राप्त निदान 5.6.4

में उपलब्ध है http://dev.mysql.com/doc/refman/5.6/en/get-diagnostics.html

+1

धन्यवाद! वास्तव में उपयोगी। मुझे बस इतना करना है कि 5.6 में नवीनीकरण किया गया है ;-) –

8

मुझे विश्वास है कि एक MySQL संग्रहीत प्रक्रिया के अंतर्गत अंतिम निष्पादित बयान के SQLSTATE के लिए उपयोग की अनुमति देता है MySQL में वर्तमान में उपलब्ध कोई बात नहीं है। इसका मतलब है कि ... त्रुटि की सटीक प्रकृति को प्राप्त करना मुश्किल/असंभव है।

सौभाग्य से यह सच नहीं है।

SHOW ERRORS LIMIT 1 -- for SQL-state > 2 
SHOW WARNINGS LIMIT 1 -- for SQL-state 1,2 

अंतिम त्रुटि या चेतावनी दिखाएगा।

आदेश हर त्रुटि लिस्टिंग रोकने के लिए, यदि आप ऐसा तरह एसक्यूएल-त्रुटियों के एक वर्ग को संभाल कर सकते हैं:

SQLWARNING SQLSTATE मूल्यों के वर्ग है कि '01' से आरंभ के लिए आशुलिपि है।

एसक्यूएलएसटीएटी मानों की कक्षा के लिए नहीं है जो '02' से शुरू होता है। यह केवल कर्सर के संदर्भ में प्रासंगिक है और यह नियंत्रित करने के लिए प्रयोग किया जाता है कि जब कोई कर्सर डेटा सेट के अंत तक पहुंच जाता है तो क्या होता है। यदि कोई और पंक्तियां उपलब्ध नहीं हैं, तो SQL डेटा मूल्य 02000 के साथ कोई डेटा स्थिति नहीं होती है। इस स्थिति का पता लगाने के लिए, आप इसके लिए एक हैंडलर सेट कर सकते हैं (या किसी न किसी स्थिति के लिए)। एक उदाहरण धारा 12.7.5, "कर्सर" में दिखाया गया है। यह स्थिति SELECT के लिए भी होती है ... INTO var_list स्टेटमेंट्स जो पंक्तियों को पुनर्प्राप्त नहीं करते हैं।

SQLEXCEPTION SQLSTATE मानों की कक्षा के लिए लघुरूप है जो '00', '01', या '02' से शुरू नहीं होता है।

तो एक अपवाद को संभालने के लिए, आप करने की जरूरत है केवल कार्य करें:

DECLARE EXIT HANDLER FOR SQLSTATE SQLEXCEPTION .....; 

लिंक:
http://dev.mysql.com/doc/refman/5.5/en/signal.html
http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html

+1

धन्यवाद जोहन देखें। 'शो त्रुटि' और 'चेतावनी' वास्तव में मुझे अलगाव में चलाने पर अंतिम त्रुटि या चेतावनी का SQLSTATE दिखाएगा। हालांकि, मैं 'MySQL संग्रहीत प्रक्रिया के भीतर' कैसे पहुंच सकता हूं? यही है, मैं अपने मूल प्रश्न में वर्णित प्रक्रिया आउटपुट वैरिएबल में 'शो त्रुटि' या 'चेतावनी' के आउटपुट को कैसे वापस कर सकता हूं? –

0

मैं निम्नलिखित तरीके को कर रहा हूँ: एक का उपयोग कर एक त्रुटि को उत्तेजित करने के लिए चुनें।उदाहरण के लिए:

SELECT RAISE_ERROR_unable_to_update_basket; 

यह निम्न त्रुटि संदेश (उदाहरण) का परिणाम देगा:

ERROR 1054 (42S22): Unknown column 'RAISE_ERROR_unable_to_update_basket' in 'field list' 

मैं एक कोशिश {...} पकड़ {में एक संग्रहीत प्रक्रिया करने के लिए अपने कॉल लपेटकर हूँ .. ।} और अब इस त्रुटि को संभाल सकते हैं। यह निश्चित रूप से केवल आपकी संग्रहीत प्रक्रिया के अंदर से कस्टम त्रुटि संदेशों को उत्तेजित करने के लिए काम करेगा और किसी भी SQL या डेटाबेस त्रुटियों को संभाल नहीं पाएगा, जो हो सकता है (डुप्लिकेट-कुंजी प्रविष्टि के कारण)। बाद के मामले में, आप जोहान के समाधान का उपयोग करके इसे हल करने में सक्षम हो सकते हैं।

+0

धन्यवाद हेराल्ड। हालांकि इस विशिष्ट उदाहरण में मैं एसक्यूएल या डेटाबेस त्रुटियों को संभालने की कोशिश कर रहा हूं। –

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