0% encontró este documento útil (0 votos)
45 vistas6 páginas

Procedimientos Almacenados en SQL para Gestión de Costos y Correos

Cargado por

gradodam1.74
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)
45 vistas6 páginas

Procedimientos Almacenados en SQL para Gestión de Costos y Correos

Cargado por

gradodam1.74
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

Use sakila2;

-- Crear un SP que permita incrementar en 2€ el coste de penalización


(film.replacement_cost) de las peliculas usando cursores
-- (Modificacion por qu edecia que era chorra)
-- Queremos visualizar por pantalla el título, el precio original y el precio final del cambio.
DELIMITER $$ -- este no me funciona
CREATE PROCEDURE incremento_penal()
BEGIN
DECLARE fin_Cursor BOOLEAN DEFAULT FALSE;
DECLARE idPeli SMALLINT UNSIGNED;
DECLARE tituloPeli VARCHAR(128);
DECLARE costePeli DECIMAL(5,2); -- como maximo 5 digitos con dos detras de la
coma Ej: (123.45)
DECLARE cursorPeli CURSOR FOR SELECT film_id, title, replacement_cost
FROM film WHERE replacement_cost > 29;
DECLARE CONTINUE HANDLER FOR NOT FOUND
BEGIN
SET fin_Cursor = TRUE;
END;

OPEN cursorPeli;
WHILE (finCursor = FALSE)
DO
FETCH cursorPeli INTO idPeli, tituloPeli,costePeli;
IF(finCursor = FALSE) THEN
-- CON CADA REGISTRO LLEVARÉ A CABO LAS ACCIONES QUE
CORRESPONDAN
UPDATE film SET replacement_cost = costePeli + 2 WHERE film_id = idPeli;
SELECT tituloPeli AS 'Titulo', costePeli AS 'coste original', replacement_cost AS
'coste actualizado' FROM film;
END IF;
END WHILE;
END$$
DELIMITER ;
DROP PROCEDURE incremento_penal;
call incremento_penal;

USE sakila2;

DELIMITER $$ -- si funciona
CREATE PROCEDURE incremento_penal()
BEGIN
DECLARE fin_Cursor BOOLEAN DEFAULT FALSE;
DECLARE idPeli SMALLINT UNSIGNED;
DECLARE tituloPeli VARCHAR(128);
DECLARE costePeli DECIMAL(5,2);
DECLARE cursorPeli CURSOR FOR SELECT film_id, title, replacement_cost FROM film
WHERE replacement_cost > 29;
DECLARE CONTINUE HANDLER FOR NOT FOUND
BEGIN
SET fin_Cursor = TRUE;
END;

OPEN cursorPeli;
FETCH cursorPeli INTO idPeli, tituloPeli, costePeli; -- Se necesita un FETCH inicial para
iniciar el bucle WHILE

WHILE (fin_Cursor = FALSE) DO


-- CON CADA REGISTRO LLEVARÉ A CABO LAS ACCIONES QUE
CORRESPONDAN
UPDATE film SET replacement_cost = costePeli + 2 WHERE film_id = idPeli;
SELECT tituloPeli AS 'Titulo', costePeli AS 'coste original', replacement_cost AS 'coste
actualizado' FROM film WHERE film_id = idPeli; -- Solo mostrar el registro modificado
FETCH cursorPeli INTO idPeli, tituloPeli, costePeli; -- Fetch dentro del bucle para
obtener el siguiente registro
END WHILE;

END$$
DELIMITER ;

CALL incremento_penal;

/*
Queremos añadir correo electrónico a los médicos del hospital. Para ello ejecutaremos la
sentencia DDL

alter table doctor ADD COLUMN email VARCHAR(250);

Nos piden a continuación crear un procedimiento almacenado que reciba como parámetro el
dominio del email que debe añadirse a cada médico (sakila2.com)
que añada mediante CURSORES a cada doctor, su email con el siguiente formato:

a) El nombre sin espacios


b) El carácter @.
c) El dominio pasado como parámetro.
d) debe estar todo en minúsculas
*/
-- use hospital_mini;
-- alter table doctor ADD COLUMN email VARCHAR(250);
USE hospital_mini;
-- , LOWER(dominio)
DELIMITER $$
CREATE PROCEDURE añadir_email(IN dominio VARCHAR(100))
BEGIN
DECLARE fin_Cursor BOOLEAN DEFAULT FALSE;
DECLARE docId CHAR(9);
DECLARE docNombre CHAR(25);
DECLARE emailNuevo VARCHAR(250);
DECLARE cursorDoctores CURSOR FOR SELECT doctorId, doctorName FROM doctor;
DECLARE CONTINUE HANDLER FOR NOT FOUND
BEGIN
SET fin_Cursor = TRUE;
END;

OPEN cursorDoctores;

WHILE (fin_Cursor = FALSE)


DO
FETCH cursorDoctores INTO docId, docNombre;
IF ( fin_Cursor = FALSE)THEN
SET emailNuevo = CONCAT(docNombre, '@', LOWER(dominio));
UPDATE doctor SET email = CONCAT(LOWER(REPLACE(doctorName, ' ',
'')),'@',dominio) WHERE doctorId = docId;
END IF;
END WHILE;

CLOSE cursorDoctores;
END$$
DELIMITER ;

Drop procedure añadir_email;


CALL añadir_email('hospital.com');
select * from doctor;

-- OTRA FORMA:
USE hospital_mini;
DELIMITER $$
CREATE PROCEDURE añadir_email(IN dominio VARCHAR(100))
BEGIN
DECLARE fin_Cursor BOOLEAN DEFAULT FALSE;
DECLARE docId CHAR(9);
DECLARE docNombre CHAR(25);
DECLARE cursorDoctores CURSOR FOR SELECT doctorId, doctorName FROM doctor;
DECLARE CONTINUE HANDLER FOR NOT FOUND
BEGIN
SET fin_Cursor = TRUE;
END;

OPEN cursorDoctores;
WHILE (fin_Cursor = FALSE)
DO
FETCH cursorDoctores INTO docId, docNombre;
IF ( fin_Cursor = FALSE)THEN
UPDATE doctor SET email = CONCAT(LOWER(REPLACE(docNombre, ' ', '')), '@',
dominio) WHERE doctorId = docId;
END IF;
END WHILE;

CLOSE cursorDoctores;
END$$
DELIMITER ;

-- OTRO EJERCICIO:
/*
Escribe un SP llamado crear_lista_emails_doctores que devuelva la lista de emails de los
doctores
separados por un punto y coma. Ejemplo:
[email protected];[email protected];...
*/
USE hospital_mini;
USE hospital_mini;
DELIMITER $$

CREATE PROCEDURE crear_lista_emails_doctores()


BEGIN
DECLARE lista_emails TEXT DEFAULT '';
DECLARE fin_cursor BOOLEAN DEFAULT FALSE;
DECLARE docEmail VARCHAR(250);

-- Declara un cursor para obtener los correos electrónicos de los doctores


DECLARE cursorDoctores CURSOR FOR SELECT email FROM doctor;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin_cursor = TRUE;

OPEN cursorDoctores;

-- Itera sobre los resultados del cursor


FETCH cursorDoctores INTO docEmail;
WHILE NOT fin_cursor DO
-- Concatena los correos electrónicos con punto y coma
SET lista_emails = CONCAT(lista_emails, docEmail, ';');
FETCH cursorDoctores INTO docEmail;
END WHILE;

CLOSE cursorDoctores;
-- Elimina el último punto y coma si existe, este no hace falta
IF LENGTH(lista_emails) > 0 THEN
SET lista_emails = LEFT(lista_emails, LENGTH(lista_emails) - 1);
END IF;

SELECT lista_emails AS lista_emails_doctores;


END$$

DELIMITER ;

-- sofia
DELIMITER $$
CREATE PROCEDURE crear_lista_emails_doctores(INOUT listaEmails VARCHAR(5000))
BEGIN
DECLARE emailDoctor VARCHAR(250) DEFAULT "";
DECLARE finCursor BOOLEAN DEFAULT FALSE;
DECLARE cursorEmailDoctor CURSOR FOR SELECT email FROM doctor;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET finCursor = TRUE;
OPEN cursorEmailDoctor;
SET listaEmails = "";
WHILE(finCursor = FALSE)
DO
FETCH cursorEmailDoctor INTO emailDoctor;
IF(finCursor = FALSE)THEN
SET listaEmails = CONCAT(emailDoctor,";",listaEmails);
END IF;
END WHILE;
CLOSE cursorEmailDoctor;
SELECT listaEmails;
END $$
DELIMITER ;

SET @listaEmails = ''; -- Definimos una variable para almacenar la lista de correos
electrónicos

-- Llamamos al procedimiento y pasamos la variable como parámetro


CALL crear_lista_emails_doctores(@listaEmails);

-- Mostramos el resultado
SELECT @listaEmails AS lista_de_emails;

También podría gustarte