Funciones

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 5

Funciones

Una función almacenada es un conjunto de instrucciones SQL que se almacena


asociado a una base de datos. Es un objeto que se crea con la sentencia CREATE
FUNCTION y se invoca con la sentencia SELECT o dentro de una expresión. Una
función puede tener cero o muchos parámetros de entrada y siempre devuelve un
valor, asociado al nombre de la función.

Sintaxis oficial
CREATE
[DEFINER = { user | CURRENT_USER }]
FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body

func_parameter:
param_name type

type:
Any valid MySQL data type

characteristic:
COMMENT 'string'
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }

routine_body:
Valid SQL routine statement
Parámetros de entrada
En una función todos los parámetros son de entrada, por lo tanto, no será
necesario utilizar la palabra reservada IN delante del nombre de los parámetros.

Resultado de salida
Una función siempre devolverá un valor de salida asociado al nombre de la
función. En la definición de la cabecera de la función hay que definir el tipo de dato
que devuelve con la palabra reservada RETURNS y en el cuerpo de la función
debemos incluir la palabra reservada RETURN para devolver el valor de la
función.

Ejemplo:

En este ejemplo se muestra una definición incompleta de una función donde se


se puede ver el uso de las palabras reservadas RETURNS y RETURN.

DELIMITER $$
DROP FUNCTION IF EXISTS xxxxx$$
CREATE FUNCTION xxxxx (par VARCHAR(50)) RETURNS INT UNSIGNED
...
BEGIN
...

RETURN total;
END
$$
Características de la función
Después de la definición del tipo de dato que devolverá la función con la palabra
reservada RETURNS, tenemos que indicar las características de la función.
Las opciones disponibles son las siguientes:

DETERMINISTIC:

Indica que la función siempre devuelve el mismo resultado cuando se


utilizan los mismos parámetros de entrada.

NOT DETERMINISTIC:

Indica que la función no siempre devuelve el mismo resultado, aunque se


utilicen los mismos parámetros de entrada. Esta es la opción que se
selecciona por defecto cuando no se indica una característica de forma
explícita.

CONTAINS SQL:

Indica que la función contiene sentencias SQL, pero no contiene sentencias


de manipulación de datos. Algunos ejemplos de sentencias SQL que
pueden aparecer en este caso son operaciones con variables (Ej: SET @x
= 1) o uso de funciones de MySQL (Ej: SELECT NOW();) entre otras. Pero
en ningún caso aparecerán sentencias de escritura o lectura de datos.

NO SQL:

Indica que la función no contiene sentencias SQL.

READS SQL DATA:

Indica que la función no modifica los datos de la base de datos y que


contiene sentencias de lectura de datos, como la sentencia SELECT.

MODIFIES SQL DATA:

Indica que la función sí modifica los datos de la base de datos y que


contiene sentencias como INSERT, UPDATE o DELETE.
Para poder crear una función en MySQL es necesario indicar al menos una de
estas tres características:

 DETERMINISTIC
 NO SQL
 READS SQL DATA

Si no se indica al menos una de estas características obtendremos el siguiente


mensaje de error.
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL,
or READS SQL DATA in its declaration and binary logging is enabled
(you *might* want to use the less safe log_bin_trust_function_creators
variable)

Declaración de variables locales con DECLARE


Tanto en los procedimientos como en las funciones es posible declarar variables
locales con la palabra reservada DECLARE.
La sintaxis para declarar variables locales con DECLARE es la siguiente:

DECLARE var_name [, var_name] ... type [DEFAULT value]


El ámbito de una variable local será el bloque BEGIN y END del procedimiento o la
función donde ha sido declarada.
Una restricción que hay que tener en cuenta a la hora de trabajar con variables
locales, es que se deben declarar antes de los cursores y los handlers.
Ejemplo

Función llamada “contar_productos” que reciba como entrada el nombre de la


categoría y devuelva el número de productos que existen dentro de esa gama.

DELIMITER $$
DROP FUNCTION IF EXISTS contar_productos$$
CREATE FUNCTION contar_productos(gama VARCHAR(50))
RETURNS INT UNSIGNED
BEGIN

-- Paso 1. Declaramos una variable local


DECLARE total INT UNSIGNED;

-- Paso 2. Contamos los productos


SET total = (
SELECT COUNT(*)
FROM producto
WHERE producto.gama = gama);

-- Paso 3. Devolvemos el resultado


RETURN total;
END
$$

DELIMITER ;

SELECT contar_productos('Herramientas');

También podría gustarte