2011-02-03 48 views
14

Quiero crear una función con argumentos opcionales en MySQL. Por ejemplo, quiero crear una función que calcule el promedio de sus argumentos. Creo una función de cinco argumentos, pero cuando el usuario pasa solo dos argumentos a la función, entonces aún debería ejecutarse y devolver el promedio de los dos argumentos.Crear una función con argumentos opcionales en MySQL

+0

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

+0

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

+2

No se puede hacer. Las respuestas a continuación son soluciones temporales. – Tom

Respuesta

4

No se pueden establecer parámetros opcionales en los procedimientos almacenados de MySQL.
Sin embargo, puede establecer parámetros opcionales en una UDF de MySQL.

¿Sabes que MySQL tiene un AVG aggregate function?

Solución Si usted puede hacer frente a la fealdad de esta solución aquí está samplecode que utiliza una cadena separada por comas con los valores como entrada y devuelve 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 ; 

Utilice concat_ws para alimentar la función.

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

También puede hacer write an UDF en C(++) o Delphi/Lazarus

+3

No veo dónde está el parámetro opcional en su UDF. Además, 'SQL ERROR (1064) Tiene un error en su sintaxis SQL ...' – Pacerier

+1

No creo que esta afirmación sea correcta: "Sin embargo, puede establecer parámetros opcionales en una UDF de MySQL". Probablemente deberías decir algo como esto: "No puedes establecer un parámetro opcional en una UDF de MySQL, pero aquí hay una solución alternativa". No puede tener un parámetro opcional en un proceso almacenado, y estoy bastante seguro de que lo mismo es cierto para un UDF. – Tom

+0

@Tom a UDF es algo diferente de una función de usuario mysql. Es una función que usted escribe en C/C++, que se puede importar a MySQL, y admite argumentos opcionales. – juacala

3

Aunque lejos de ser una solución ideal, esto es cómo resolví parámetros opcionales para una función concat que necesitaba:

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: Este medio de tienes que llamar al método que corresponde al número de argumentos.

1

Otro enfoque es pasar solo un parámetro 'super' que es una cadena con comas que separa los parámetros reales. El procedimiento mysql puede analizar el parámetro 'super' en los parámetros reales separados. Ejemplo:

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