Salve a tutti!
Avrei un problemino da dover risolvere e spero che qualcuno di voi mi possa aiutare.
Ho la necessità di inserire in una tabella una chiave composta da due attributi di cui uno è un contatore.
Non potevo far ricorso ad un'unica sequenza da cui prelevare i valori di questo contatore in quanto mi serve che per ogni utente ci sia un contatore dedicato (può succedere che due tuple abbiano uguale valore nel campo contatore perché inserite da due utenti diversi, l’altro attributo che compone la chiave della tabella sarà per forza diverso visto che sono utenti diversi).
Ho creato allora tante sequenze quanti sono gli utenti che possono fare inserimenti in questa tabella e per procedere all’inserimento ho creato una procedura che preleva automaticamente dalla sequenza giusta il giusto valore per il contatore:
CREATE OR REPLACE PROCEDURE Inserimento_NOTAM
(identificativo IN CHAR,
serie_notam IN CHAR,
testo_notam IN VARCHAR2,
data_ora_inizio IN VARCHAR2,
data_ora_fine IN VARCHAR2 DEFAULT NULL,
superiore IN VARCHAR2 DEFAULT NULL,
inferiore IN VARCHAR2 DEFAULT NULL)
IS
BEGIN
--DECLARE
--vall_curr NUMBER;
EXECUTE IMMEDIATE 'INSERT INTO Notam VALUES(:i,:ser,:t,TO_DATE(:d_i,''DD/MM/YYYY-HH24:MI''),TO_DATE(:d_f,''DD/MM/YYYY-HH24:MI''),:sup,:inf,NULL,Notam'|| identificativo || '.NextVal,NULL)'
USING identificativo, serie_notam, testo_notam, data_ora_inizio, data_ora_fine, superiore, inferiore;
COMMIT;
END;
Il problema è che vi è anche un trigger che si attiva per gli inserimenti in questa tabella. Se il trigger solleva un’eccezione, e quindi non vi è inserimento, comunque il valore prelevato dalla sequenza non è più disponibile e viene perso…come posso fare per fare in modo che questo valore non venga perso?