Algunas de las restricciones expuestas aquí se refieren a todas las rutinas almacenadas; esto es, procedimientos almacenados y funciones almacenadas. Algunas de las restricciones sólo se refieren a funciones almacenadas, y no a los procedimientos almacenados.
Todas las restricciones para las funciones almacenadas se refieren también a los disparadores(triggers).
Las rutinas almacenadas no pueden contener sentencias SQL arbitrarias. Las siguientes sentencias no están permitidas dentro de una rutina almacenada:
CHECK TABLES
LOCK TABLES
, UNLOCK
TABLES
FLUSH
LOAD DATA
, LOAD TABLE
Sentencias SQL preparadas(PREPARE
,
EXECUTE
, DEALLOCATE
).
Implicación: No puedo usar SQL dinámico dentro de una rutina
almacenada(donde construya dinámicamente sentencias como
cadenas de caracteres y después ejecutarlas).
Además, en funciones almacenadas (pero no para procedimientos almacenados), no están permitidas las siguientes sentencias:
Sentencias que hacen commits o rollbacks explícitos o implícitos.
Sentencias que devuelvan un resultado. Esto incluye sentencias
SELECT
que no tienen una cláusula
INTO
y la sentencia
SHOW
. Una función puede procesar un
resultado tanto con SELECT … INTO
como con el uso de un cursor y de la sentencia
FETCH
.
El uso de una rutina almacenada puede causar problemas de replicación. Este asunto se expone con profundidad en Sección 19.3, “Registro binario de procedimientos almacenados y disparadores”.
INFORMATION_SCHEMA
todavía no tiene una tabla
PARAMETERS
, así que aplicaciones que, en
tiempo de ejecución, necesiten adquirir información de los
parámetros de la rutina, deben usar técnicas como tratar la
salida de la sentencia SHOW CREATE
.
No existen facilidades para el depurado de rutinas almacenadas.
Las rutinas almacenadas usan cursores materializados, no cursores nativos. (El resultado se genera y guarda en el lado del servidor, y después se devuelve línea por línea a medida que el cliente lo extrae.)
La sentencia CALL
no se puede preparar. Esto es
cierto tanto para las sentencias preparadas del lado del servidor
como para las sentencias SQL preparadas.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.