DAM - DAW - MP 0484 Bases de Dades - NF5
Pràctica 9 – Procediments
En aquesta pràctica, creareu procediments que contenen consultes DML.
Per fer aquests exercicis cal tenir les següents taules creades (Compte que li deixem les PKs):
CREATE OR REPLACE TABLE EMPLEATS AS SELECT * FROM empresa.EMPLOYEES;
CREATE OR REPLACE TABLE FEINES LIKE empresa.JOBS;
INSERT INTO FEINES SELECT * FROM empresa.JOBS;
Canvieu el delimitador per a treballar millor (si ho feu des de la shell)
DELIMITER //
Es recomana, per possibles errades, treballar amb una transacció
START TRANSACTION //
SAVEPOINT P1 //
i així, en qualsevol moment poder desfer el que s'ha fet
ROLLBACK TO P1 //
-
Creeu el procediment
ADD_FEINAper afegir un nou treball a la taulaFEINES.-
Creeu un procediment anomenat
ADD_FEINAamb dos paràmetres:job_idijob_title. -
Executeu el procediment amb
'IT_DBA'com ajob_idi'Database Administrator'com ajob_title. Consulteu la taulaFEINESper veure els resultats. -
Torneu a executar el procediment, passant un job_id
'ST_MAN'i job_title'Stock Manager'. Què passa i per què?
Possible solució
DELIMITER // CREATE OR REPLACE PROCEDURE ADD_FEINA(p_job_id TYPE OF feines.job_id, p_job_title TYPE OF feines.job_title) MODIFIES SQL DATA BEGIN INSERT INTO FEINES(job_id, job_title) VALUES(p_job_id , p_job_title); END // DELIMITER ; START TRANSACTION; CALL ADD_FEINA('IT_DBA', 'Database Administrator'); SELECT * FROM FEINES; CALL ADD_FEINA('ST_MAN', 'Stock Manager'); -- Dona ERROR per repetir la PK COMMIT; -
-
Creeu un procediment anomenat
UPD_FEINAper modificar un treball a la taulaFEINES.-
Creeu un procediment anomenat
UPD_FEINAper actualitzar eljob_title. Proporcioneu eljob_idi un noujob_title, utilitzant dos paràmetres. Cal incloure la gestió d'excepcions necessària per si no es produeix cap actualització. -
Executeu el procediment per canviar el
job_titledel job_idIT_DBAa'Data Administrator'. -
Consulteu la taula
FEINESper veure els resultats.
Possible solució
DELIMITER // CREATE OR REPLACE PROCEDURE UPD_FEINA(p_job_id TYPE OF feines.job_id, p_job_title TYPE OF feines.job_title) MODIFIES SQL DATA BEGIN DECLARE v_q INT; DECLARE v_missatge VARCHAR(200); SELECT COUNT(*) INTO v_q FROM FEINES WHERE job_id = p_job_id; IF v_q = 0 THEN SET v_missatge = CONCAT('Feina no trobada: ', p_job_id); SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = v_missatge; END IF; UPDATE FEINES SET job_title = p_job_title WHERE job_id = p_job_id; END // DELIMITER ; START TRANSACTION; CALL UPD_FEINA('IT_DBA', 'Data Administrator'); CALL UPD_FEINA('IT_WEB', 'Web Developer'); COMMIT; -
-
Creeu un procediment anomenat
DEL_FEINAper eliminar un treball de la taulaFEINES.-
Creeu un procediment anomenat
DEL_FEINAper eliminar treball, amb un únic paràmetre elJOB_ID. Incloeu l'excepció necessària per si no es troba la feina a esborrar. -
Executeu el procediment amb
IT_DBAcom aJOB_ID. Consulteu la taulaFEINES. -
Comproveu la gestió d'excepcions intentant suprimir un
JOB_IDque no existeix (per exempleIT_WEB). Hauríeu d'obtenir el missatge que heu utilitzat a la secció de gestió d'excepcions.
Possible solució
DELIMITER // CREATE OR REPLACE PROCEDURE DEL_FEINA(p_job_id TYPE OF feines.job_id) MODIFIES SQL DATA BEGIN DECLARE v_q INT; DECLARE v_missatge VARCHAR(200); DELETE FROM FEINES WHERE job_id = p_job_id; IF ROW_COUNT() = 0 THEN SET v_missatge = CONCAT('Feina no trobada: ', p_job_id); SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = v_missatge; END IF; END // DELIMITER ; START TRANSACTION; CALL DEL_FEINA('IT_DBA'); CALL DEL_FEINA('IT_WEB'); COMMIT; -
-
Creeu un procediment anomenat
QUERY_EMPper consultar la taulaEMPLEATS, recuperant elsalaryi eljob_idd'un empleat.- Creeu un procediment que retorni un valor de les columnes
salaryijob_idper a un determinat identificador d'empleat (employee_id).
b) Aquest procediment rebrà tres paràmetres. Un d’entrada (
IN) i dos de sortida (OUT).c) Per a provar-ho necessitarem 2 o 3 variables d’usuari. Almenys per les variables de sortida (
OUT)d) Executeu el procediment per mostrar el
salaryijob_idper a l'empleat107.Possible solució
DELIMITER // CREATE OR REPLACE PROCEDURE QUERY_EMP( p_employee_id TYPE OF empleats.employee_id, OUT p_salary TYPE OF empleats.salary, OUT p_job_id TYPE OF empleats.job_id) CONTAINS SQL BEGIN SELECT salary, job_id INTO p_salary, p_job_id FROM EMPLEATS WHERE employee_id = p_employee_id; END // CALL QUERY_EMP(107, @sou, @job) // SELECT @sou, @job // - Creeu un procediment que retorni un valor de les columnes