sql >> Base de Datos >  >> RDS >> Mysql

MySQL procedimiento almacenado vs función, ¿cuál usaría cuándo?

La diferencia más general entre procedimientos y funciones es que se invocan de manera diferente y para diferentes propósitos:

  1. Un procedimiento no devuelve un valor. En su lugar, se invoca con una instrucción CALL para realizar una operación, como modificar una tabla o procesar registros recuperados.
  2. Se invoca una función dentro de una expresión y devuelve un único valor directamente a la persona que llama para que se utilice en la expresión.
  3. No puede invocar una función con una declaración CALL, ni puede invocar un procedimiento en una expresión.

La sintaxis para la creación de rutinas difiere un poco para los procedimientos y funciones:

  1. Los parámetros del procedimiento se pueden definir como solo de entrada, solo de salida o ambos. Esto significa que un procedimiento puede devolver valores a la persona que llama mediante el uso de parámetros de salida. Se puede acceder a estos valores en sentencias que siguen a la sentencia CALL. Las funciones solo tienen parámetros de entrada. Como resultado, aunque tanto los procedimientos como las funciones pueden tener parámetros, la declaración de parámetros del procedimiento difiere de la de las funciones.
  2. Las funciones devuelven valor, por lo que debe haber una cláusula RETURNS en una definición de función para indicar el tipo de datos del valor devuelto. Además, debe haber al menos una declaración RETURN dentro del cuerpo de la función para devolver un valor a la persona que llama. RETURNS y RETURN no aparecen en las definiciones de procedimientos.

    • Para invocar un procedimiento almacenado, use la declaración CALL statement . Para invocar una función almacenada, haga referencia a ella en una expresión. La función devuelve un valor durante la evaluación de la expresión.

    • Un procedimiento se invoca mediante una instrucción CALL y solo puede devolver valores mediante variables de salida. Se puede llamar a una función desde dentro de una declaración como cualquier otra función (es decir, invocando el nombre de la función) y puede devolver un valor escalar.

    • Especificar un parámetro como IN, OUT o INOUT solo es válido para un PROCEDIMIENTO. Para una FUNCIÓN, los parámetros siempre se consideran parámetros IN.

    Si no se proporciona ninguna palabra clave antes del nombre de un parámetro, es un parámetro IN por defecto.Los parámetros para las funciones almacenadas no están precedidos por IN, OUT o INOUT. Todos los parámetros de función se tratan como parámetros IN.

Para definir un procedimiento almacenado o una función, use CREAR PROCEDIMIENTO o CREAR FUNCIÓN respectivamente:

CREATE PROCEDURE proc_name ([parameters])
 [characteristics]
 routine_body


CREATE FUNCTION func_name ([parameters])
 RETURNS data_type       // diffrent
 [characteristics]
 routine_body

Una extensión de MySQL para procedimientos almacenados (no funciones) es que un procedimiento puede generar un conjunto de resultados, o incluso múltiples conjuntos de resultados, que la persona que llama procesa de la misma manera que el resultado de una instrucción SELECT. Sin embargo, el contenido de dichos conjuntos de resultados no se puede usar directamente en la expresión.

Rutinas almacenadas (refiriéndose tanto a los procedimientos almacenados como a las funciones almacenadas) están asociados con una base de datos en particular, al igual que las tablas o las vistas. Cuando elimina una base de datos, también se eliminan las rutinas almacenadas en la base de datos.

Los procedimientos y funciones almacenados no comparten el mismo espacio de nombres. Es posible tener un procedimiento y una función con el mismo nombre en una base de datos.

En procedimientos almacenados se puede usar SQL dinámico pero no en funciones o activadores.

Las declaraciones preparadas de SQL (PREPARE, EXECUTE, DEALLOCATE PREPARE) se pueden usar en procedimientos almacenados, pero no en funciones almacenadas o disparadores. Por lo tanto, las funciones almacenadas y los disparadores no pueden usar SQL dinámico (donde construye declaraciones como cadenas y luego las ejecuta). (SQL dinámico en rutinas almacenadas MySQL )

Algunas diferencias más interesantes entre FUNCIÓN y PROCEDIMIENTO ALMACENADO:

  1. (Este punto es copiado de una publicación de blog . ) El procedimiento almacenado es un plan de ejecución precompilado donde las funciones no lo son. Función analizada y compilada en tiempo de ejecución. Procedimientos almacenados, almacenados como un pseudocódigo en la base de datos, es decir, forma compilada.

  2. (No estoy seguro de este punto. )
    El procedimiento almacenado tiene la seguridad y reduce el tráfico de red y también podemos llamar al procedimiento almacenado en cualquier número. de aplicaciones a la vez. referencia

  3. Las funciones normalmente se usan para cálculos donde los procedimientos as normalmente se usan para ejecutar la lógica de negocios.

  4. Las funciones no pueden afectar el estado de la base de datos (las declaraciones que realizan una confirmación o reversión explícita o implícita no están permitidas en la función), mientras que los procedimientos almacenados pueden afectar el estado de la base de datos mediante la confirmación, etc.
    referencia:J.1. Restricciones en rutinas y disparadores almacenados

  5. Las funciones no pueden usar FLUSH declaraciones mientras que los procedimientos almacenados pueden hacer.

  6. Las funciones almacenadas no pueden ser recursivas, mientras que los procedimientos almacenados sí pueden serlo. Consulte Sección 5.2.3 , “Variables del sistema” , para más información.

  7. Dentro de una función o activador almacenado, no se permite modificar una tabla que ya está siendo utilizada (para lectura o escritura) por la instrucción que invocó la función o activador. Buen ejemplo:¿Cómo actualizar la misma tabla al eliminar en MYSQL?

Nota :que aunque algunas restricciones se aplican normalmente a funciones almacenadas y disparadores pero no a procedimientos almacenados, esas restricciones sí se aplican a procedimientos almacenados si se invocan desde dentro de una función almacenada o disparador. Por ejemplo, aunque puede usar FLUSH en un procedimiento almacenado, dicho procedimiento almacenado no se puede llamar desde una función almacenada o disparador.