2009-06-11 21 views
49

He buscado en Google esto y continúo con "No, no es posible", pero estas publicaciones estaban fechadas entre 2005 y 2007, así que me pregunto si esto ha cambiado. Un ejemplo de código:¿Es posible tener un parámetro predeterminado para un procedimiento almacenado de mysql?

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

Una de las soluciones ha sido la de pasar nula y a continuación, comprobar para nula y establecer la variable. No quiero hacer eso y no debería hacerlo. Si esto es cierto, los desarrolladores de MySQL deben activarse porque hay mucho más que podría hacer con MSSQL.

+1

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

+0

¿tiene mariaDB el mismo problema? –

Respuesta

55

Todavía no es posible.

+5

¿Hay alguna solución? Como comprobar si el parámetro es nulo, entonces dale un valor predeterminado? – papaiatis

+1

@papaiatis Sí, solo puede agregar una declaración if, vea mi otra publicación a continuación. – Dive50

+3

No sé por qué esta es la respuesta aceptada cuando aquí debajo @ Dive50 tiene una solución útil, que estoy a punto de implementar porque estoy enfrentando el mismo problema. – f1r3br4nd

10

Si mira en CREATE PROCEDURE Syntax para la versión más reciente de MySQL, verá que el parámetro de procedimiento solo puede contener el especificador IN/OUT/INOUT, el nombre y el tipo de parámetro.

Por lo tanto, los valores predeterminados todavía no están disponibles en la última versión de MySQL.

1

No, esto no es compatible con la sintaxis de rutina almacenada de MySQL.

No dude en enviar una solicitud de función al bugs.mysql.com.

+2

Publicando esto de la otra pregunta que hice: http://bugs.mysql.com/bug.php?id=15975 – DJTripleThreat

36

Hemos trabajado alrededor de esta limitación agregando una instrucción IF simple en el procedimiento almacenado. Prácticamente pasamos una cadena vacía cada vez que queremos guardar el valor predeterminado en el DB.

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

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

¿Por qué no utilizar 'null' en su lugar? – Pacerier

+1

esto muestra cuánto amor puedes dar a mysql, mientras tanto en sql simplemente puedes poner "param_name int (11) = NULL" ... gracias Oracle – Shide

4

Desafortunadamente, MySQL no soporta DEFAULT valores de los parámetros, por lo que:

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

devuelve el error:

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 

Para evitar esta limitación, sólo tiene que crear procedimientos adicionales que asignan valores predeterminados para el procedimiento original:

A continuación, se ejecuta este:

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

volverá:

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

Entonces, si se asegura de utilizar sólo los procedimientos blah2(), blah1() y blah0(), su código no tiene por qué ser inmediatamente actualizado, cuando agrega un tercer parámetro al procedimiento blah().

12
SET myParam = IFNULL(myParam, 0); 

Explicación: IFNULL(expression_1, expression_2)

La función devuelve IFNULLexpression_1expression_1 si no es NULL; de lo contrario, devuelve expression_2. La función IFNULL devuelve una cadena o un número en función del contexto donde se utiliza.

Cuestiones relacionadas