2011-02-03 20 views
14

Voglio creare una funzione con argomenti opzionali in MySQL. Ad esempio, voglio creare una funzione che calcoli la media dei suoi argomenti. Creo una funzione di cinque argomenti, ma quando l'utente passa solo due argomenti alla funzione, dovrebbe comunque funzionare e restituire la media dei due argomenti.Creare una funzione con argomenti opzionali in MySQL

+0

correlato: http://stackoverflow.com/questions/91150/mysql-stored-procedure –

+0

duplicato: http://stackoverflow.com/questions/12652241/writing-optional-parameters-within -stored-procedures-in-mysql –

+2

Non può essere fatto. Le risposte qui sotto sono soluzioni alternative. – Tom

risposta

4

Non è possibile impostare parametri opzionali nelle stored procedure MySQL.
È tuttavia possibile impostare parametri facoltativi in ​​una UDF MySQL.

Sai che MySQL ha un AVG aggregate function?

Soluzione Se si può affrontare la bruttezza di questa soluzione alternativa ecco SampleCode che utilizza una stringa separati da virgola con valori come input e restituisce la media.

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 ; 

Utilizzare concat_ws per alimentare la funzione.

SELECT MyAvg(CONCAT_WS(',',100,200,300,500)) AS test; 

si può anche write an UDF in C(++) o Delphi/Lazarus

+3

Non vedo dov'è il parametro opzionale nell'UDF. Inoltre, 'SQL ERROR (1064) Hai un errore nella sintassi SQL ...' – Pacerier

+1

non credo questa affermazione è corretta: "Si può comunque impostare i parametri opzionali in un MySQL UDF". Probabilmente dovresti dire qualcosa del tipo: "Non puoi impostare un parametro opzionale in una UDF MySQL, ma ecco una soluzione". Non si può avere un parametro opzionale in un Procostorico, e sono sicuro che lo stesso è vero per un UDF. – Tom

+0

@Tom a UDF è qualcosa di diverso da una funzione utente mysql. È una funzione che scrivi in ​​C/C++, che può essere importata in MySQL e supporta argomenti opzionali. – juacala

3

Mentre lontano da una soluzione ideale, ecco come ho risolto parametri opzionali per una funzione concat avevo bisogno:

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

Nota: questo vuol dire devi chiamare il metodo che corrisponde al numero di argomenti.

1

Un altro approccio è passare solo un parametro 'super' che è stringa con virgole in esso che separano i parametri reali. La procedura mysql può quindi analizzare il parametro 'super' nei parametri reali separati. Esempio:

create procedure procWithOneSuperParam(param1 varchar(500)) 
declare param2 varchar(100); 
begin 
if LOCATE(',',param1) > 0 then 
    .. param2=<extract the string after the ',' from param1> .. 
Problemi correlati