Está en la página 1de 8

Capítulo 4: Procedimientos almacenados y

funciones
4.1. Procedimientos almacenados

También conocido como Stored Procedrure, es un conjunto de instrucciones en


lenguaje SQL que realizan una tarea determinada.

Por lo general se utiliza un procedimiento almacenado cuando la tarea es muy


pesada y hacerla desde la aplicación es muy costoso.

La ventaja es que libera cualquier tarea pesada que podría tener nuestra
aplicación, aunque se debe hacer cuando sea necesario ya que crear de manera
excesiva procedimientos almacenados puede ser una mala práctica, ya que se
puede tener a futuro problemas en cuanto a la organización del código u otras
cosas

4.1.1. Sintaxis

La sentencia para crear un procedimiento almacenado es la siguiente

CREATE PROCEDURE ‘nombre’ ([parameter[,…]])


BEGIN
//Instrucciones
END

Los parámetros indican la entrada y salida de datos que podríamos usar para el
procedimiento y la salida de datos que devolvería el procedimiento almacenado.
En el siguiente ejemplo se observa un procedimiento almacenado para contar el
número de productos por código:

DELIMITER\\
CREATE PROCEDURE `contar_productos` (IN codigo varchar(5),
OUT nproductos INT)
BEGIN
SELECT
COUNT(*)
INTO
nproductos
FROM
productos
WHERE
cprincipal=codigo;
END//
DELIMITER;
4.2. Funciones

Una función en MySQL es una rutina creada para tomar unos parámetros,
procesarlos y retornar en una salida.

Se diferencian de los procedimientos por las siguientes características:

 Solamente pueden tener parámetros de entrada IN Y no parámetros de


sálida OUT o INOUT.
 Deben retornar en un valor con algun tipo de dato definido.
 Pueden usarse en el contexto de una sentencia SQL.
 Solo retornan un valor individual no, un conjunto de registros.

4.2.1. Sintaxis

La sintaxis para crear una función es similar a la de los procedimientos

CREATE FUNCTION nombre_función (parámetro 1, parámetro 2,…)


RETURNS tipodato
[atributos de la rutina]
<bloque de instrucciones>

A continuación se presenta un ejemplo de una función:


DELIMITER\\
CREATE FUNCTION factorial(x INT) RETURNS INT(11)
BEGIN
DECLARE factorial INT;
-- Guardamos el valor de x
SET factorial = x ;
-- Caso en que x sea menor o igual a 0
IF x <= 0 THEN
RETURN 1;
END IF;
-- Iteramos para obtener multiplicaciones consecutivas
bucle: LOOP
-- Cada iteracion reducimos en 1 a x
SET x = x - 1 ;
-- Condición de parada del bucle
IF x<1 THEN
LEAVE bucle;
END IF;
-- Factorial parcial
SET factorial = factorial * x ;
END LOOP bucle;
-- Retornamos en el factorial
RETURN factorial;
END//
DELIMITER ;

No confundir RETURNS con RETURN. La primera es para indicar el tipo de dato

de retorno de la función y el segundo es para retronar el valor en el cuerpo de ña


función.

Ejemplo de función que retorna el nombre completo de la prioridad de un

cliente, introduciendo como parámetro el campo prioridad.

Creación de la función:
DELIMITER \\
CREATE FUNCTION EXT_PRIORIDAD (cliente_prioridad VARCHAR(5))
RETURNS
VARCHAR(20)
BEGIN
CASE cliente_prioridad
WHEN 'A' THEN
RETURN 'Alto';
WHEN 'M' THEN
RETURN 'Medio';
WHEN 'B' THEN
RETURN 'Bajo';
ELSE
RETURN 'NN';
END CASE;
END//
DELIMITER;

Con ella podemos consultar de la siguiente forma a los clientes de la base de


datos

SELECT NOMBRE, APELLIDO, EXT_PRIORIDAD (PRIORIDAD)

FROM CLIENTE

De esta manera hemos usado la función en un contexto de consulta. También


podemos usar funciones en las sentencias DELETE y UPDATE, siempre y
cuando el valor retornado sea acorde con las necesidades.

Para actualizar una función usamos el comando ALTER FUNCTION con esta
sentencia podemos cambiar los atributos de la función, pero no podremos
cambiar el cuerpo. La sintaxis es la siguiente:

ALTER FUNCTION nombre_funcion


[SQL SECURITY {DEFINER|INVOKER}]
[COMMENT descripción ]
Si quisiéramos añadir una descripción a una función que calcula el promedio de
huéspedes diario con respecto a una fecha llamada promedio_huespedes,
hacemos lo siguiente:

ALTER FUNCTION promedio_huespedes


COMMENT 'Calculo del promedio diario de huéspedes entre una fecha inicial
y una fecha final'

Usando el comando DROP FUNCTION simplemente especificamos el nombre


de la función y esta se borrara de la base de datos. Su sintaxis está definida de
la siguiente manera

DROP FUNCTION nombre_función


Capítulo 5: Cursores y Auditoria de MySQL
4.1. Cursores

Un cursor se utiliza para el procesamiento individual de las filas devueltas por el


sistema gestor de base de datos para una consulta, es decir, un cursor puede
verse como un iterador sobre la colección de filas que habrá en el set de
resultados.

Este tipo de estructuras sólo deben utilizarse cuando no haya otra forma de
manipular conjuntos de datos en una sola instrucción.

Para ampliar el procesamiento de los conjuntos de resultados, los cursores:

 Permiten situarse en filas específicas del conjunto de resultados.


 Recuperan una fila o un bloque de filas de la posición actual en el conjunto
de resultados.
 Admiten modificaciones de los datos de las filas en la posición actual del
conjunto de resultados.
 Admiten diferentes grados de visibilidad para los cambios que otros
usuarios realizan en la información de la base de datos que se presenta
en el conjunto de resultados.

4.1.1. Sintaxis

-Este comando declara un cursor. Pueden definir varios recursos en una rutina,
pero cada cursor en un bloque debe tener un nombre único.

DECLARE cursor_name CURSOR

FOR select_statement

-Este comando abre un cursor declarado previamente

OPEN cursor_name

-Este comando trata el siguiente registro(si existe) usando el cursor abierto que
se especifique, y avanza el puntero del cursor. Si no existen más registros
disponibles, ocurrirá una condición de Sin Datos con el valor SQLSTATE 02000.
Puede configurar un manejador (handler) para detectar esta condición (o para
una condición NOT FOUND).

FETCH cursor_name INTO var_name[ , var_name]

-Este comando cierra un cursor abierto previamente. Si no se cierra


explícitamente, un cursor se cierra al final del comando compuesto en que se
declara.

CLOSE cursor_name

-Llama a la función y ejecutar el cursor

SELECT city_list () AS cities

4.1.2 Ejemplo

Listar los nombres de los turistas en una línea

DELIMITER $$
CREATE FUNCTION c_lista_turistas() RETURNS VARCHAR(255) READS SQL
DATA
BEGIN
DECLARE fin INTEGER DEFAULT 0;
DECLARE nombreT VARCHAR(50) DEFAULT "";
DECLARE lista VARCHAR(255) DEFAULT "";

DECLARE turista_cur CURSOR FOR SELECT nombre FROM turista;


DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin = 1;
OPEN turista_cur;
obt_nombT: LOOP
FETCH turista_cur INTO nombreT;
IF fin THEN
LEAVE obt_nombT;
END IF;
SET lista = CONCAT(lista,", ",nombreT);
END LOOP obt_nombT;
CLOSE turista_cur;
RETURN SUBSTR(lista,3);
END;
// para ejecutar la function
SELECT c_lista_turistas() AS Lista_Turistas;

4.2. Auditorias

Es un proceso implementado por los auditores de sistemas con el fin de auditar


los accesos a los datos, por lo general siguiendo bien una metodología basada
en un checklist que contempla los puntos que se quiere comprobar mediante la
evaluación de riesgos potenciales

En concreto, se realiza un examen de los accesos a los datos almacenados en


las bases de datos con el fin de poder medir, monitorear y tener constancia de
los accesos a la información almacenada en las mismas. Si bien el objetivo
puede variar en función de la casuística, en todos los casos el fin último persigue,
de uno u otro modo, la seguridad corporativa.

También podría gustarte