में वैकल्पिक तर्कों के साथ एक फ़ंक्शन बनाएं, मैं MySQL में वैकल्पिक तर्कों के साथ एक फ़ंक्शन बनाना चाहता हूं। उदाहरण के लिए, मैं फ़ंक्शन बनाना चाहता हूं जो इसके तर्कों की औसत गणना करता है। मैं पांच तर्कों का एक फ़ंक्शन बनाता हूं, लेकिन जब उपयोगकर्ता फ़ंक्शन में केवल दो तर्क पास करता है तो उसे अभी भी दो तर्कों का औसत चलाना चाहिए और वापस करना चाहिए।MySQL
MySQL
उत्तर
आप MySQL संग्रहीत प्रक्रियाओं में वैकल्पिक पैरामीटर सेट नहीं कर सकते हैं।
हालांकि आप एक MySQL UDF में वैकल्पिक पैरामीटर सेट कर सकते हैं।
आप जानते हैं कि MySQL में AVG aggregate function है?
वर्कअराउंड यहाँ samplecode इनपुट के रूप में मूल्यों के साथ एक अल्पविराम से अलग स्ट्रिंग का उपयोग करता है और औसत रिटर्न कि आप इस समाधान की कुरूपता का सामना कर सकते हैं।
DELIMITER $$
CREATE FUNCTION MyAvg(valuestr varchar) RETURNS float
BEGIN
DECLARE output float;
DECLARE arg_count integer;
DECLARE str_length integer;
DECLARE arg float;
DECLARE i integer;
SET output = NULL;
SET i = LENGTH(valuestr);
IF i > 0 THEN BEGIN
SET arg_count = 1;
WHILE i > 0 DO BEGIN
IF MID(valuestr, i, 1)
SET i = i - 1;
END; END WHILE;
/* calculate average */
SET output = 0;
SET i = arg_count;
WHILE i > 0 DO BEGIN
SET arg = SUBSTRING_INDEX(
SUBSTRING_INDEX(valuestr, ',' , i)
, ',', -1);
SET output = output + arg;
SET i = i - 1;
END; END WHILE;
SET output = output/arg_count;
END; END IF;
RETURN output;
END $$
DELIMITER ;
फ़ंक्शन को खिलाने के लिए concat_ws का उपयोग करें।
SELECT MyAvg(CONCAT_WS(',',100,200,300,500)) AS test;
भी कर सकते हैं write an UDFC(++) में या Delphi/Lazarus
मुझे नहीं लगता कि आपके यूडीएफ में वैकल्पिक पैरामीटर कहां है। इसके अलावा, 'एसक्यूएल त्रुटि (1064) आपको अपने एसक्यूएल सिंटेक्स में एक त्रुटि है ... ' – Pacerier
मुझे नहीं लगता कि यह कथन सही है:" हालांकि आप एक MySQL UDF में वैकल्पिक पैरामीटर सेट कर सकते हैं "। आपको शायद ऐसा कुछ कहना चाहिए: "आप एक MySQL UDF में वैकल्पिक पैरामीटर सेट नहीं कर सकते हैं, लेकिन यहां एक कार्य-आसपास है"। आपके पास संग्रहीत प्रक्रिया में वैकल्पिक पैरामीटर नहीं हो सकता है, और मुझे पूरा यकीन है कि यह एक यूडीएफ के बारे में भी सच है। – Tom
@ एक यूडीएफ के लिए एक mysql उपयोगकर्ता समारोह से कुछ अलग है। यह एक ऐसा कार्य है जिसे आप सी/सी ++ में लिखते हैं, जिसे MySQL में आयात किया जा सकता है, और यह वैकल्पिक तर्कों का समर्थन करता है। – juacala
जबकि अब तक एक आदर्श समाधान से है, तो यहां मैं एक concat समारोह मैं जरूरत के लिए वैकल्पिक पैरामीटर हल है:
delimiter ||
create function safeConcat2(arg1 longtext, arg2 varchar(1023))
returns longtext
return safeConcat3(arg1, arg2, '');
||
create function safeConcat3(arg1 longtext, arg2 varchar(1023), arg3 varchar(1023))
returns longtext
return safeConcat4(arg1, arg2, arg3, '');
||
create function safeConcat4(arg1 longtext, arg2 varchar(1023), arg3 varchar(1023), arg4 varchar(1023))
returns longtext
begin
declare result longText;
set result = concat(arg1, arg2, arg3, arg4);
if(result is null) then
set result=arg1;
end if;
return result;
end
||
नोट: यह साधन आपको उस विधि को कॉल करना होगा जो तर्कों की संख्या से मेल खाता है।
एक और तरीका केवल एक 'सुपर' पैरामीटर को पार करना है जो वास्तविक पैरामीटर को अलग करने में अल्पविरामों के साथ स्ट्रिंग है। MySQL प्रक्रिया तब 'सुपर' पैरामीटर को अलग वास्तविक पैरामीटर में पार्स कर सकती है। उदाहरण:
create procedure procWithOneSuperParam(param1 varchar(500))
declare param2 varchar(100);
begin
if LOCATE(',',param1) > 0 then
.. param2=<extract the string after the ',' from param1> ..
संबंधित: http://stackoverflow.com/questions/91150/mysql-stored-procedure –
डुप्लिकेट: http://stackoverflow.com/questions/12652241/writing-optional-parameters-within -स्टोर-प्रक्रिया-इन-माइस्क्ल –
यह नहीं किया जा सकता है। नीचे दिए गए उत्तर कामकाज हैं। – Tom