0% encontró este documento útil (0 votos)
5 vistas14 páginas

UT5 Programacion de Bases de Datos

El documento aborda la programación de bases de datos en SQL, incluyendo funciones, procedimientos almacenados, eventos, disparadores, excepciones y cursores. Se explican ejemplos prácticos de cada concepto, como la creación de funciones para calcular montos, procedimientos para realizar transacciones, y el uso de disparadores para establecer valores automáticamente. Además, se detalla cómo manejar excepciones y utilizar cursores para procesar filas en procedimientos almacenados.

Cargado por

sara
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
5 vistas14 páginas

UT5 Programacion de Bases de Datos

El documento aborda la programación de bases de datos en SQL, incluyendo funciones, procedimientos almacenados, eventos, disparadores, excepciones y cursores. Se explican ejemplos prácticos de cada concepto, como la creación de funciones para calcular montos, procedimientos para realizar transacciones, y el uso de disparadores para establecer valores automáticamente. Además, se detalla cómo manejar excepciones y utilizar cursores para procesar filas en procedimientos almacenados.

Cargado por

sara
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 14

PROGRAMACIÓN DE

BASES DE DATOS
UNIDAD TEMÁTICA Nº5

BASES DE DATOS
Técnico superior en Desarrollo
Aplicaciones Web
UT5 Programación de bases de datos

1. FUNCIONES
En SQL, una función es una secuencia de declaraciones que realizan
una tarea específica. Las funciones se utilizan para manipular o
calcular datos. SQL proporciona una serie de funciones incorporadas
que se pueden utilizar para realizar diversas tareas, incluyendo de
cadenas, numéricas, de fecha y de agregación. Algunas funciones son:
Funciones de cadena: realizan operaciones sobre datos de tipo
cadena.
CONCAT: concatena dos o más cadenas.

CONCAT(string1, string2, ..., string_n)

Ejemplo:

SELECT CONCAT('Hello', ' ', 'World');

Esto dará como resultado 'Hello World'.

LENGTH: devuelve la longitud de una cadena.

LENGTH(string)

Ejemplo:

SELECT LENGTH('Hello World');

Esto dará como resultado 11.

Funciones numéricas: realizan operaciones sobre datos numéricos.


ROUND: redondea un número a un número específico de
decimales.

ROUND(number, decimals)

Ejemplo:

SELECT ROUND(4.567, 2);

02
UT5 Programación de bases de datos

Esto dará como resultado 4.57.

ABS: Devuelve el valor absoluto de un número.

ABS(number)

Ejemplo:

SELECT ABS(-4);

Esto dará como resultado 4.

Funciones de fecha y hora: realizan operaciones sobre estos datos.


NOW: Devuelve la fecha y hora actual.

NOW()

Ejemplo:

SELECT NOW();

Esto dará como resultado la fecha y hora actuales.

YEAR: Extrae el año de una fecha

YEAR(date)

Ejemplo:

SELECT YEAR('2023-06-08');

Esto dará como resultado 2023.

Además de estas funciones, SQL también proporciona funciones de


agregación, que se utilizan para realizar cálculos sobre un conjunto de
filas. Las cuales ya las discutimos anteriormente.

03
UT5 Programación de bases de datos

2. PROCEDIMIENTOS ALMACENADOS
Los procedimientos almacenados son un grupo de declaraciones SQL que
se almacenan en una base de datos, las cuales se pueden llamar y
ejecutar repetidamente. Estos procedimientos pueden aceptar
parámetros de entrada al igual que devolver múltiples valores de salida.
Son extremadamente útiles para realizar operaciones repetitivas y
complejas, mejorando la eficiencia, así como la seguridad de las
aplicaciones de base de datos.

En MySQL, puedes utilizar la instrucción CREATE PROCEDURE para crear


uno. La sintaxis es:

CREATE PROCEDURE procedure_name ([parameter1 [type1], ...])


BEGIN
-- SQL statements
END;

En este contexto, procedure_name es el nombre que quieres darle a tu


procedimiento almacenado, parameter1, parameter2, ... son los
parámetros que puede aceptar tu procedimiento y type1, type2, ... son los
tipos de esos parámetros.

Podrías crear un procedimiento almacenado que seleccione todos los


empleados con un salario mayor a un valor determinado:

CREATE PROCEDURE SelectHighSalaryEmployees(IN salary


DECIMAL(10,2))
BEGIN
SELECT * FROM employees WHERE employee_salary > salary;
END;

Posteriormente, para llamar a un procedimiento almacenado, se usa la


instrucción CALL:

CALL procedure_name([parameter1, ...]);

04
UT5 Programación de bases de datos

Por lo que, para llamar al procedimiento almacenado


SelectHighSalaryEmployees con un salario de 50000, usarías:

CALL SelectHighSalaryEmployees(50000);

Ventajas
Eficiencia: los procedimientos almacenados se almacenan en la
base de datos ya compilados, lo que puede hacer que su ejecución
sea más rápida que las consultas SQL ad hoc.
Seguridad: los procedimientos almacenados pueden proporcionar
un nivel adicional de seguridad, puesto que puedes restringir el
acceso a los datos de la base de datos a los procedimientos
almacenados en lugar de permitir el acceso directo a las tablas.
Modularidad: los procedimientos almacenados permiten la
modularidad en las aplicaciones de base de datos. Puedes escribir
un procedimiento una vez, y luego llamarlo desde cualquier parte
de tu aplicación.
Mantenimiento: los cambios en la lógica de la base de datos se
pueden realizar simplemente modificando los procedimientos
almacenados, en lugar de hacer cambios en el código de la
aplicación en varios lugares.

3. EVENTOS Y DISPARADORES
Los eventos y disparadores son dos tipos de objetos de base de datos
que permiten automatizar acciones en respuesta a ciertos cambios o
situaciones.

Un evento es una tarea que se ejecuta con base en un horario definido.


En otras palabras, puedes programar eventos para que se ejecuten en un
momento específico y realicen ciertas tareas. Los eventos son
especialmente útiles para tareas de mantenimiento de bases de datos
como la limpieza de registros obsoletos, generación de informes
periódicos u otras tareas que necesitan ser realizadas de manera
rutinaria.

Un evento se crea de siguiente manera:

05
UT5 Programación de bases de datos

CREATE EVENT event_name


ON SCHEDULE schedule
DO
event_body;

Aquí, event_name es el nombre del evento, schedule define cuándo se


debe ejecutar el evento y event_body es lo que el evento debe hacer.

Para demostrar esto, podrías crear un evento que elimine todos los
registros de una tabla logs que sean más antiguos que 30 días y que se
ejecute todos los días a medianoche:

CREATE EVENT CleanOldLogs


ON SCHEDULE EVERY 1 DAY
STARTS TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY
DO
DELETE FROM logs WHERE log_date < NOW() - INTERVAL 30 DAY;

En otra perspectiva, un disparador (trigger) es un conjunto de


instrucciones que se ejecutan automáticamente en respuesta a ciertos
eventos en una tabla específica de una BD. Los disparadores son muy
útiles para mantener la integridad de los datos, registrar cambios o
automatizar tareas particulares.

Los disparadores se pueden activar por eventos INSERT, UPDATE y


DELETE, así como definir para que se ejecuten antes (BEFORE) o después
(AFTER) de estos eventos. Los creamos de la siguiente forma:

CREATE TRIGGER trigger_name


trigger_time trigger_event
ON table_name FOR EACH ROW
trigger_body;

En donde trigger_name es el nombre del disparador, trigger_time puede


ser BEFORE o AFTER, trigger_event puede ser INSERT, UPDATE o DELETE,
table_name es la tabla a la que se asocia el disparador y trigger_body es
lo que el disparador debe hacer.

06
UT5 Programación de bases de datos

Por ejemplo, creamos un disparador que registre cada eliminación de una


fila en la tabla employees en la tabla audit:

Copy code
CREATE TRIGGER RecordEmployeeDeletion
AFTER DELETE
ON employees FOR EACH ROW
BEGIN
INSERT INTO audit (action, employee_id, timestamp)
VALUES ('DELETE', OLD.employee_id, NOW());
END;

En este caso, OLD.employee_id se refiere al employee_id de la fila que se


está eliminando.

4. EXCEPCIONES
Las excepciones son eventos que alteran el flujo normal de ejecución de
un programa. En el contexto de las BD, suelen ser errores que ocurren
durante la ejecución de una consulta SQL, dentro de un procedimiento
almacenado o un disparador.

MySQL utiliza el mecanismo de manejo de errores SQLSTATE para


gestionar las excepciones. En un procedimiento almacenado, puedes
declarar un controlador de condiciones que se activará cuando se
produzca un determinado estado SQLSTATE.

DECLARE EXIT HANDLER FOR SQLEXCEPTION


BEGIN
-- código para manejar la excepción
ROLLBACK;
END;

En este caso, el EXIT HANDLER FOR SQLEXCEPTION se activará para


cualquier excepción de SQL. Cuando esta se produce, se revierte
cualquier transacción en curso y luego se sale del procedimiento
almacenado.

07
UT5 Programación de bases de datos

A veces, puedes querer manejar errores específicos de manera diferente.


MySQL te permite especificar un estado SQLSTATE específico en el
controlador de condiciones. Por ejemplo:

DECLARE EXIT HANDLER FOR SQLSTATE '23000'


BEGIN
-- código para manejar la excepción
ROLLBACK;
SELECT 'Intento de insertar un duplicado. Operación deshecha.';
END;

Aquí, el controlador se activará cuando se produzca una excepción con el


estado SQLSTATE '23000', que corresponde a una violación de integridad
(como intentar insertar un valor duplicado en una columna que tiene una
restricción de unicidad).

5. CURSORES
En SQL, un cursor es una herramienta que te permite recorrer las filas de
un conjunto de resultados. Esto puede ser útil cuando necesitas realizar
operaciones en cada fila del conjunto de resultados. Los cursores se
utilizan a menudo en los procedimientos almacenados y funciones, donde
el conjunto de resultados de una consulta debe ser procesado fila por
fila.

Para utilizar un cursor, primero necesitas declararlo. Aquí está la sintaxis


general en MySQL:

DECLARE cursor_name CURSOR FOR select_statement;

Donde cursor_name es el nombre que deseas darle al cursor y


select_statement es la consulta SQL que devuelve el conjunto de
resultados que deseas recorrer.

Una vez que has declarado un cursor, debes abrirlo para poder empezar
a utilizarlo.

OPEN cursor_name;

08
UT5 Programación de bases de datos

Para recuperar una fila de un cursor, usa la instrucción FETCH.

FETCH NEXT FROM cursor_name INTO variable_name;

Donde cursor_name es el nombre de tu cursor y variable_name es la


variable en la que deseas almacenar la fila recuperada.

Después de que hayas terminado de utilizar un cursor, debes cerrarlo.

CLOSE cursor_name;

Como ilustración, este es un ejemplo donde se muestra de cómo utilizar


un cursor en un procedimiento almacenado para seleccionar y procesar
cada fila de una tabla:

DELIMITER //
CREATE PROCEDURE process_rows()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE a CHAR(16);
DECLARE cur CURSOR FOR SELECT column_name FROM table_name;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cur;

read_loop: LOOP
FETCH cur INTO a;
IF done THEN
LEAVE read_loop;
END IF;
-- Procesar la fila aquí (la columna se almacena en la variable 'a')
END LOOP;

CLOSE cur;
END;
//
DELIMITER ;

09
UT5 Programación de bases de datos

En este procedimiento, se declara un cursor para seleccionar todas las


filas de la tabla table_name. Luego, se abre el cursor y se entra en un
bucle, donde cada iteración recupera la siguiente fila del cursor. Cuando
no hay más filas que recuperar, se cierra y se termina el procedimiento.

Finalmente, continuaremos trabajando con nuestra base de datos


“tiendalinea”. Veamos cómo se aplican los conceptos a ella:
1. Funciones. Creemos una función para calcular el monto total de una
transacción. Esta tomará como parámetro el idTransaccion y
retornará el monto total de la transacción.

DELIMITER //
CREATE FUNCTION CalcularTotal(idTrans INT) RETURNS
DECIMAL(10,2)
BEGIN
DECLARE total DECIMAL(10,2);
SELECT SUM(Precio) INTO total
FROM Productos
JOIN DetalleTransaccion ON Productos.idProducto =
DetalleTransaccion.idProducto
WHERE DetalleTransaccion.idTransaccion = idTrans;
RETURN total;
END //
DELIMITER ;

Para utilizar esta función:

SELECT CalcularTotal(1);

2.Procedimientos almacenados. Creemos un procedimiento


almacenado que inserta una transacción y sus detalles asociados en
una operación atómica. Este procedimiento tomará como parámetros
el idCliente y una lista de idProducto.}

DELIMITER //
CREATE PROCEDURE RealizarTransaccion(IN idCli INT, IN idProd INT)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION

10
UT5 Programación de bases de datos

BEGIN
-- Error occurred, rollback and exit
ROLLBACK;
SELECT 'Ocurrió un error, se deshizo la transacción.';
END;
START TRANSACTION;
INSERT INTO Transaccion (Fecha, Monto_total, Estado_de_envio,
idCliente)
VALUES (CURDATE(), (SELECT Precio FROM Productos WHERE
idProducto = idProd), 'En preparación', idCli);
INSERT INTO DetalleTransaccion (idTransaccion, idProducto)
VALUES (LAST_INSERT_ID(), idProd);
UPDATE Transaccion SET Monto_total =
CalcularTotal(LAST_INSERT_ID()) WHERE idTransaccion =
LAST_INSERT_ID();
COMMIT;
END //
DELIMITER ;

Para usar este procedimiento:

CALL RealizarTransaccion(1, 1);


CALL RealizarTransaccion(1, 2);

3.Eventos y disparadores. Creemos un disparador que se activa antes


de insertar una nueva transacción. Este disparador establecerá el
Monto_total de la transacción utilizando nuestra función CalcularTotal.

DELIMITER //
CREATE TRIGGER SetMontoTotal BEFORE INSERT ON Transaccion
FOR EACH ROW
BEGIN
SET NEW.Monto_total = CalcularTotal(NEW.idTransaccion);
END //
DELIMITER ;

Ahora, cada vez que insertemos una nueva transacción, el Monto_total


se establecerá automáticamente.

11
UT5 Programación de bases de datos

4.Excepciones. Como hemos visto, podemos manejar las excepciones


dentro de un procedimiento almacenado utilizando un controlador de
condiciones. En nuestro procedimiento almacenado
RealizarTransaccion, hemos definido un controlador de condiciones
para gestionar cualquier error SQL que pueda ocurrir durante la
transacción.
5.Cursores. Finalmente, vamos a utilizar un cursor en un procedimiento
almacenado para listar todos los productos comprados en una
transacción. Este procedimiento tomará como parámetro el
idTransaccion.

DELIMITER //
CREATE PROCEDURE ListarProductos(IN idTrans INT)
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE nombreProd VARCHAR(100);
DECLARE cur CURSOR FOR
SELECT Nombre FROM Productos
JOIN DetalleTransaccion ON Productos.idProducto =
DetalleTransaccion.idProducto
WHERE DetalleTransaccion.idTransaccion = idTrans;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cur;
read_loop: LOOP
FETCH cur INTO nombreProd;
IF done THEN
LEAVE read_loop;
END IF;
SELECT nombreProd;
END LOOP;
CLOSE cur;
END //
DELIMITER ;

Para usar este procedimiento:

CALL ListarProductos(1);

12
UT5 Programación de bases de datos

En este procedimiento, estamos utilizando un cursor para recorrer todos


los productos asociados a una transacción. Por cada producto, estamos
seleccionando su nombre y lo estamos imprimiendo.

13

También podría gustarte