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.

