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);