दिलचस्प पोस्ट
पृथ्वी के रेंडरिंग पर तीन। जेएस में मैं एक 'वातावरण' कैसे प्रदान कर सकता हूं? Android एप्लिकेशन पर लॉग इन करने के लिए Google- खाता का उपयोग करना प्रतिलिपि पेस्ट कैसे अक्षम करें (ब्राउज़र) आर। के स्रोत कोड को कैसे देखें? आंतरिक या पारिवारिक फ़ंक्शन? मैं HTML5 / जावास्क्रिप्ट का उपयोग कर कनेक्शन प्रकार (वाईफाई / लैन / WWAN) कैसे देखूं? ऑब्जेक्ट प्रॉपर्टी को दूसरे ऑब्जेक्ट में डुप्लिकेट कैसे करें? MySQL: कैसे कमांड लाइन से एक .sql फ़ाइल निर्यात और आयात करें? एक 1 डी संकीर्ण सरणी में नमी के साथ स्थानीय अधिकतम / न्यूनतम खोजना प्रोग्रामात्मक रूप से OpenSSL का उपयोग करके X509 प्रमाणपत्र बनाएं Spring @ExceptionHandler @ResponseBody के साथ काम नहीं करता है क्लोन और मूल रिमोट रिपॉजिटरी के बीच git diff @ आस्पेक्ट पहलू के लिए स्प्रिंग आटोवर्ड बीन रिक्त है Django / jQuery कैस्केडिंग चयन बक्से? सी पंक्ति से फ़ाइल लाइन पढ़ें Windows में: आप किसी अन्य उपयोगकर्ता संदर्भ के तहत प्रशासक मोड में एक प्रक्रिया कैसे लॉन्च कर सकते हैं?

MySQL फ़ंक्शन के अंदर एक त्रुटि कैसे बढ़ाएं

मैंने एक MySQL फ़ंक्शन बना लिया है और यदि पैरामीटर के लिए मानों को पारित किया गया है, तो एक त्रुटि बढ़ाना अमान्य है। MySQL फ़ंक्शन के अंदर एक त्रुटि को बढ़ाने के लिए मेरे विकल्प क्या हैं?

वेब के समाधान से एकत्रित समाधान "MySQL फ़ंक्शन के अंदर एक त्रुटि कैसे बढ़ाएं"

MySQL 5.5 संकेतों का परिचय देता है, जो अन्य भाषाओं में अपवादों के समान हैं:

http://dev.mysql.com/doc/refman/5.5/en/signal.html

उदाहरण के लिए, mysql कमांड लाइन क्लाइंट में:

 mysql> SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Custom error'; ERROR 1644 (45000): Custom error 

यह वास्तव में तीनों उत्तरों का संयोजन है आप त्रुटि बढ़ाने के लिए एक गैर-मौजूद प्रक्रिया को कॉल करते हैं, और फिर एक एक्सेप्टर हैंडलर को घोषित करें जो आपके द्वारा उत्पन्न त्रुटि को पकड़ता है। यहां एक उदाहरण है, हटाए जाने से पहले एक त्रुटि को फेंकने के लिए SQLSTATE 42000 (प्रक्रिया मौजूद नहीं है) यदि पंक्ति को हटा दिया गया है तो एक विदेशी कुंजी आईडी सेट है:

 DROP PROCEDURE IF EXISTS decount_test; DELIMITER // CREATE DEFINER = 'root'@'localhost' PROCEDURE decount_test ( p_id bigint ) DETERMINISTIC MODIFIES SQL DATA BEGIN DECLARE EXIT HANDLER FOR SQLSTATE '42000' SELECT 'Invoiced barcodes may not have accounting removed.'; IF (SELECT invoice_id FROM accounted_barcodes WHERE id = p_id ) THEN CALL raise_error; END IF; DELETE FROM accounted_barcodes WHERE id = p_id; END // DELIMITER ; 

आउटपुट:

 call decount_test(123456); +----------------------------------------------------+ | Invoiced barcodes may not have accounting removed. | +----------------------------------------------------+ | Invoiced barcodes may not have accounting removed. | +----------------------------------------------------+ 

क्यों एक घोषित INTEGER चर में एक VARCHAR स्टोर ही नहीं?

 DELIMITER $$ DROP FUNCTION IF EXISTS `raise_error` $$ CREATE FUNCTION `raise_error`(MESSAGE VARCHAR(255)) RETURNS INTEGER DETERMINISTIC BEGIN DECLARE ERROR INTEGER; set ERROR := MESSAGE; RETURN 0; END $$ DELIMITER ; -- set @foo := raise_error('something failed'); -- or within a query 

त्रुटि संदेश है:

गलत पूर्णांक मान: पंक्ति 1 पर कॉलम 'त्रुटि' के लिए 'कुछ विफल'

यह सही नहीं है, लेकिन यह एक बहुत ही वर्णनात्मक संदेश देता है और आपको कोई एक्सटेंशन DLL लिखना नहीं है।

MySQL 5 में आप किसी संग्रहीत कार्यविधि को कॉल करके एक त्रुटि बढ़ा सकते हैं (कॉल बढ़ाएं_अरेर) या एक क्वेरी के लिए एक अमान्य मूल्य (जैसे कि एक नल परिचित फ़ील्ड के लिए नल) को पास करना। एक MySQL फ़ंक्शन के भीतर त्रुटियों को उठाने पर रोलाण्ड Bouman द्वारा एक दिलचस्प पोस्ट है:

http://rpbouman.blogspot.com/2005/11/using-udf-to-raise-errors-from-inside.html

आप एक मौजूदा फ़ंक्शन को अमान्य संख्या में तर्क के साथ भी कॉल कर सकते हैं।

आपको अपवाद संचालकों को परिभाषित करना होगा http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html पर एक नज़र डालें