MySQL

2011-02-03 22 views
14

में वैकल्पिक तर्कों के साथ एक फ़ंक्शन बनाएं, मैं MySQL में वैकल्पिक तर्कों के साथ एक फ़ंक्शन बनाना चाहता हूं। उदाहरण के लिए, मैं फ़ंक्शन बनाना चाहता हूं जो इसके तर्कों की औसत गणना करता है। मैं पांच तर्कों का एक फ़ंक्शन बनाता हूं, लेकिन जब उपयोगकर्ता फ़ंक्शन में केवल दो तर्क पास करता है तो उसे अभी भी दो तर्कों का औसत चलाना चाहिए और वापस करना चाहिए।MySQL

+0

संबंधित: http://stackoverflow.com/questions/91150/mysql-stored-procedure –

+0

डुप्लिकेट: http://stackoverflow.com/questions/12652241/writing-optional-parameters-within -स्टोर-प्रक्रिया-इन-माइस्क्ल –

+2

यह नहीं किया जा सकता है। नीचे दिए गए उत्तर कामकाज हैं। – Tom

उत्तर

4

आप 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

+3

मुझे नहीं लगता कि आपके यूडीएफ में वैकल्पिक पैरामीटर कहां है। इसके अलावा, 'एसक्यूएल त्रुटि (1064) आपको अपने एसक्यूएल सिंटेक्स में एक त्रुटि है ... ' – Pacerier

+1

मुझे नहीं लगता कि यह कथन सही है:" हालांकि आप एक MySQL UDF में वैकल्पिक पैरामीटर सेट कर सकते हैं "। आपको शायद ऐसा कुछ कहना चाहिए: "आप एक MySQL UDF में वैकल्पिक पैरामीटर सेट नहीं कर सकते हैं, लेकिन यहां एक कार्य-आसपास है"। आपके पास संग्रहीत प्रक्रिया में वैकल्पिक पैरामीटर नहीं हो सकता है, और मुझे पूरा यकीन है कि यह एक यूडीएफ के बारे में भी सच है। – Tom

+0

@ एक यूडीएफ के लिए एक mysql उपयोगकर्ता समारोह से कुछ अलग है। यह एक ऐसा कार्य है जिसे आप सी/सी ++ में लिखते हैं, जिसे MySQL में आयात किया जा सकता है, और यह वैकल्पिक तर्कों का समर्थन करता है। – juacala

3

जबकि अब तक एक आदर्श समाधान से है, तो यहां मैं एक 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 
|| 

नोट: यह साधन आपको उस विधि को कॉल करना होगा जो तर्कों की संख्या से मेल खाता है।

1

एक और तरीका केवल एक 'सुपर' पैरामीटर को पार करना है जो वास्तविक पैरामीटर को अलग करने में अल्पविरामों के साथ स्ट्रिंग है। 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> ..