Tabla de contenidos
La discución aqui describe restricciones que aplican a el uso de las caracteristicas de MySQL como son las subconsultas ovistas.
Algunas de las restricciones notadas aqui aplican para todas las rutinas almacenadas; esto es, procedimientos almacenados y funciones almacenadas. Algunas de las restricciones solo aplican a funciones almacenadas, y no a los procedimientos almacenados.
Todas las restricciones para las funciones almacenadas aplican también a los disparadores(triggers).
Las rutinas almacenadas no pueden contener sentencias SQL arbitarias. Las siguientes sentencias no son 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 y después ejecutarlas).
Para funciones almacenadas (pero no para procedimientos almacenados), las siguientes sentencias son adicionalmente no permitidas:
-
Sentencias que hacen commit o un rollback explicito o implicito.
-
Sentencias que regresen un resultado. Esto incluye sentencias
SELECT
que no tienen una clausulaINTO
clause y la sentenciaSHOW
. Una funcion puede procesar un resultado tanto como para unSELECT … INTO
o como para el uso de cursor y la sentenciaFETCH
.
El uso de una rutina almacenada puede causar problemas de replicación. Este tema es discutido más adelante en Sección 19.3, “Registro binario de procedimientos almacenados y disparadores”.
INFORMATION_SCHEMA
todavia no tiene una tabla
PARAMETERS
, asi que aplicaciones que necesiten
adquirir información de los parámetros de la rutina deben usar
técnicas como tratar la salida de la sentenciaSHOW
CREATE
.
No existen facilidades de depurado para rutinas almacenadas.
Rutinas almacenadas usan cursores materializados, no cursores nativos. (El resultado es generado y guardado de lado del servidor, y después regresado renglón por renglón como lo solicite el cliente.)
La stentencia CALL
no puede ser preparada.
Esto aplica para las sentencias preparadas de lado del servidor
y para las sentencias SQL preparadas.