2009-06-11 6 views
49

मैंने इसे गुमराह किया है और "नहीं, यह संभव नहीं है" के साथ आ रहा है लेकिन इन पदों की तिथि 2005-2007 थी, इसलिए मुझे आश्चर्य है कि यह बदल दिया गया है या नहीं। एक कोड उदाहरण:क्या MySQL संग्रहित प्रक्रिया के लिए डिफ़ॉल्ट पैरामीटर होना संभव है?

CREATE PROCEDURE `blah` 
(
    myDefaultParam int = 0 -- This breaks the code for some reason 
) 
BEGIN 
    -- Do something here 
END 

समाधानों में से एक को शून्य पास करना है और फिर शून्य के लिए जांचें और चर सेट करें। मैं ऐसा नहीं करना चाहता हूं और मुझे नहीं करना चाहिए। यदि यह सच है तो MySQL devs को जागने की आवश्यकता है क्योंकि एमएसएसक्यूएल के साथ मैं इतना कुछ कर सकता हूं।

+1

डुप्लिकेट: http://stackoverflow.com/questions/12652241/writing-optional-parameters-within-stored-procedures-in-mysql –

+0

करता MariaDB यह एक ही समस्या है? –

उत्तर

55

यह अभी भी संभव नहीं है।

+5

क्या कोई कामकाज है? पैरामीटर शून्य होने पर जांचने की तरह यह एक डिफ़ॉल्ट मान दें? – papaiatis

+1

@papaiatis हां आप बस एक कथन जोड़ सकते हैं, नीचे मेरी दूसरी पोस्ट देखें। – Dive50

+3

मुझे नहीं पता कि यह नीचे दिए गए स्वीकार्य उत्तर क्यों है @ Dive50 के पास एक उपयोगी कामकाज है, जिसे मैं कार्यान्वित करने वाला हूं क्योंकि मुझे एक ही समस्या का सामना करना पड़ रहा है। – f1r3br4nd

10

यदि आप नवीनतम MySQL संस्करण के लिए CREATE PROCEDURE Syntax देखें तो आप देखेंगे कि प्रक्रिया पैरामीटर में केवल IN/OUT/INOUT निर्दिष्ट, पैरामीटर नाम और प्रकार हो सकता है।

तो, डिफ़ॉल्ट मान अभी भी नवीनतम MySQL संस्करण में अनुपलब्ध हैं।

1

नहीं, यह MySQL संग्रहीत नियमित वाक्यविन्यास में समर्थित नहीं है।

bugs.mysql.com पर एक सुविधा अनुरोध सबमिट करने के लिए स्वतंत्र महसूस करें।

+2

अन्य प्रश्न से इसे पोस्ट करना मैंने पूछा: http://bugs.mysql.com/bug.php?id=15975 – DJTripleThreat

36

हमने संग्रहित प्रक्रिया में एक सरल IF कथन जोड़कर इस सीमा के आसपास काम किया। जब भी हम डीबी में डिफ़ॉल्ट मान को सहेजना चाहते हैं, हम व्यावहारिक रूप से एक खाली स्ट्रिंग पास करते हैं।

CREATE DEFINER=`test`@`%` PROCEDURE `myProc`(IN myVarParam VARCHAR(40)) 
BEGIN 
    IF myVarParam = '' THEN SET myVarParam = 'default-value'; END IF; 

    ...your code here... 
END 
+4

इसके बजाय 'null' का उपयोग क्यों नहीं करें? – Pacerier

+1

इससे पता चलता है कि आप mysql को कितना प्यार दे सकते हैं, इस बीच एसक्यूएल में आप बस "param_name int (11) = NULL" डाल सकते हैं ... धन्यवाद ओरेकल – Shide

4

दुर्भाग्य से, MySQL DEFAULT पैरामीटर मान का समर्थन नहीं करता है, तो:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual 
that corresponds to your MySQL server version for the right syntax to use 
near 'DEFAULT 0) BEGIN END' at line 3 

इस सीमा को हल करने के लिए, बस अतिरिक्त प्रक्रियाओं है कि आवंटित बनाएँ:

CREATE PROCEDURE `blah` 
(
    myDefaultParam int DEFAULT 0 
) 
BEGIN 
    -- Do something here 
END 

त्रुटि देता है मूल प्रक्रिया के लिए डिफ़ॉल्ट मान:

DELIMITER // 

DROP PROCEDURE IF EXISTS blah// 
DROP PROCEDURE IF EXISTS blah2// 
DROP PROCEDURE IF EXISTS blah1// 
DROP PROCEDURE IF EXISTS blah0// 

CREATE PROCEDURE blah(param1 INT UNSIGNED, param2 INT UNSIGNED) 
BEGIN 
    SELECT param1, param2; 
END; 
// 

CREATE PROCEDURE blah2(param1 INT UNSIGNED, param2 INT UNSIGNED) 
BEGIN 
    CALL blah(param1, param2); 
END; 
// 

CREATE PROCEDURE blah1(param1 INT UNSIGNED) 
BEGIN 
    CALL blah2(param1, 3); 
END; 
// 

CREATE PROCEDURE blah0() 
BEGIN 
    CALL blah1(4); 
END; 
// 

फिर, इस चल:

CALL blah(1, 1); 
CALL blah2(2, 2); 
CALL blah1(3); 
CALL blah0(); 

वापस आ जाएगी:

+--------+--------+ 
| param1 | param2 | 
+--------+--------+ 
|  1 |  1 | 
+--------+--------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

+--------+--------+ 
| param1 | param2 | 
+--------+--------+ 
|  2 |  2 | 
+--------+--------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

+--------+--------+ 
| param1 | param2 | 
+--------+--------+ 
|  3 |  3 | 
+--------+--------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

+--------+--------+ 
| param1 | param2 | 
+--------+--------+ 
|  4 |  3 | 
+--------+--------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

फिर, अगर आप केवल blah2(), blah1() और blah0() प्रक्रियाओं का उपयोग सुनिश्चित करें, अपने कोड तुरंत होने की जरूरत नहीं होगी अपडेट किया गया, जब आप blah() प्रक्रिया में तीसरा पैरामीटर जोड़ते हैं।

12
SET myParam = IFNULL(myParam, 0); 

स्पष्टीकरण: IFNULL(expression_1, expression_2)

IFNULL फ़ंक्शन expression_1 अगर expression_1NULL नहीं है; अन्यथा यह expression_2 देता है। IFNULL फ़ंक्शन उस स्ट्रिंग या न्यूमेरिक को संदर्भ के आधार पर देता है जहां इसका उपयोग किया जाता है।

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