Buongiorno. Ho una table di nome DIPART (che contiene informazioni relative ai dipartimenti) e due attributi: NUM_DIPART che è il numero del dipartimento (chiave) e NUM_DIP che è il numero di dipendenti per ogni dipartimento.
Dovrei scrivere ora una procedura sql che controlla il valore di NUM_DIP per ogni dipartimento della table, e se è maggiore di 3 lo si decrementa di un valore x dato in input alla procedura, se è minore di 3, lo si incrementa dello stesso valore.
Ho provato a scrivere la procedura, ma non funziona perchè è come se non riuscisse a leggere i valori delle tuple sui due attributi indicati. Facendo infatti diverse select interne alla procedura, ciò che risulta è che num_dip (variabile interna alla procedura) risulta null, come se il cursore nella riga di FETCH non ritornasse il valore concreto che serve poi per la select NUM_DIP, o addirittura che proprio questa select, a prescindere dalla condizione where, restituisca tutti valori null. Vi prego aiutatemi.
In ogni caso, dopo l'esecuzione mi dice 0 rows affected, quindi a questo punto non entra nemmeno negli if.
Di sotto la procedura:
DELIMITER $$
CREATE PROCEDURE ModNumDip(IN VALORE INTEGER)
BEGIN
DECLARE dip_id INT;
DECLARE num_dip INT;
DECLARE done INT DEFAULT FALSE;
-- Dichiarazione del cursore per iterare sui dipartimenti
DECLARE dip_cursor CURSOR FOR
SELECT NUM_DIPART
FROM DIPART;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- Apertura del cursore
OPEN dip_cursor;
-- Loop per iterare sui dipartimenti
dip_loop: LOOP
FETCH dip_cursor INTO dip_id;
-- Uscita dal loop se non ci sono più record
IF done THEN
LEAVE dip_loop;
END IF;
-- Aggiorna il numero di dipendenti per il dipartimento
SELECT NUM_DIP INTO num_dip FROM DIPART WHERE NUM_DIPART=dip_id;
IF (num_dip < 3) THEN
UPDATE DIPART SET NUM_DIP = num_dip + VALORE WHERE NUM_DIPART=dip_id; ;
ELSE
UPDATE DIPART SET NUM_DIP = num_dip - VALORE WHERE NUM_DIPART=dip_id;
END IF;
END LOOP;
-- Chiusura del cursore
CLOSE dip_cursor;
END $$
DELIMITER
CALL ModNumDip(5);