Salve!

Come da titolo ho un singolare problema che riguarda la (presunta?) persistenza dei valori delle variabili dichiarate in una funzione.

Questo e' il codice:

codice:
	    DECLARE
		D1 DATE;
		D2 CHAR(6);
		M1 CHAR(6);
		M2 CHAR(6);
		L1 CHAR(6);
		T1 TIME(6);
		T2 TIME(6);
		T3 TIME(6);
		S1 NUMERIC(6);
		S2 NUMERIC(6);
		COUNTC NUMERIC(6);
		COUNTR NUMERIC(6);
	    BEGIN

		SELECT data_a, giorno_a, matr_ut, ora_a, cod_loc, n_tessera INTO D1, D2, M2, T1, L1, S1
		FROM richiesta_accesso, utente
		WHERE matr_ut = NEW.matr_ut AND
		    matr_ut = utente.matr;
		
		SELECT h_inizio, h_fine INTO T2, T3
		FROM orario as o, permesso as p
		WHERE p.id_orario = o.id_orario AND
		    p.cod_loc = L1 AND
		    o.giorno = D2;



	        IF T1 > T2 AND T1 < T3 THEN
		    SELECT COUNT(*)+1 INTO COUNTC
		    FROM accesso
		    WHERE cod_loc = L1 AND
			data_a = D1 AND
			ora_a = T1 AND
			n_tessera = S1
		    GROUP BY stato_accesso
		    HAVING stato_accesso = 'consentito';
		    IF COUNTC IS NULL THEN
			COUNTC = 1;
		    END IF;
	            INSERT INTO accesso
		    VALUES (L1, D1, T1, 'consentito', S1, COUNTC);
	        ELSE 
		    SELECT COUNT(*)+1 INTO COUNTR
		    FROM accesso
		    WHERE cod_loc = L1 AND
			data_a = D1 AND
			ora_a = T1 AND
			n_tessera = S1
		    GROUP BY stato_accesso
		    HAVING stato_accesso = 'negato';
		    IF COUNTR IS NULL THEN
			COUNTR = 1;
		    END IF;
	            INSERT INTO accesso
		    VALUES (L1, D1, T1, 'negato', S1, COUNTR);

		    IF COUNTR > 3 THEN
			RAISE EXCEPTION 'Superati i 3 rifiuti giornalieri';
		    END IF;

	        END IF;
	    RETURN NEW;
	    END;
Ora, questa funzione viene chiamata da un trigger after insert on richiesta_accesso.
Il problema e' il seguente:
a fronte di queste 3 insert,
codice:
insert into richiesta_accesso values ('M1', '2010-01-01', '11:00:00', 'L1', 'lun'); --valida
insert into richiesta_accesso values ('M1', '2010-01-01', '11:20:00', 'L1', 'lun'); --valida
insert into richiesta_accesso values ('M1', '2010-01-01', '11:40:00', 'L1', 'lun'); --valida
in accesso finisce sempre e solo '11:00:00' come ora, e non '11:00:00' per la prima, 11:20:00 per la seconda ecc.
La parte che riguarda il count funziona o l'inserimento si bloccherebbe a causa della chiave duplicata.

Cio' che non capisco dunque e': T1, la variabile che contiene l'ora, e' persistente? Anche facendo le 3 insert separatamente, prima la 1 poi la 2 poi la 3 il risultato non cambia, l'ora che finisce in accesso e' quella della prima richiesta_accesso inserita.

Sapete dirmi perche' cio' accade?

Un altro problema:
La funzione reagisce molto male se la prima insert e' invece una richiesta accesso non valida (se la richiesta e' valida o no, come si vede nel codice della funzione, viene deciso guardando una tabella permesso e una tabella orario nella quale sono scritti i diritti di accesso di ciascuno)
del tipo
codice:
 insert into richiesta_accesso values ('M1', '2010-01-01', '19:30:00', 'L1', 'lun') --non valida
alla prossima insert questo sara' l'errore:
ERROR: duplicate key value violates unique constraint "accesso_pkey"
CONTEXT: SQL statement "INSERT INTO accesso VALUES ( $1 , $2 , $3 , 'negato', $4 , $5 )"
PL/pgSQL function "controllo_accesso" line 55 at SQL statement


********** Errore **********

ERROR: duplicate key value violates unique constraint "accesso_pkey"
Stato SQL: 23505
Contesto: SQL statement "INSERT INTO accesso VALUES ( $1 , $2 , $3 , 'negato', $4 , $5 )"
PL/pgSQL function "controllo_accesso" line 55 at SQL statement
eppure il codice dell'else ovvero del rifiuto e' gestito esattamente allo stesso modo di quello dell'accesso consentito, inoltre ricordo che lo stato_accesso (il campo di accesso in cui finisce o 'consentito' o 'negato') e' in chiave primaria, avere quindi lo stesso valore di COUNT per una richiesta andata a buon fine ed una no non e' un problema..

Ovviamente il problema non si pone se la richiesta di accesso non valida arriva come seconda con una prima richiesta valida, in quanto per il primo problema ad essere inserita e' di nuovo l'ora della prima richiesta e quindi valida..

L'ho fatta lunga..:P ringrazio in anticipo tutti quelli che sapranno aiutarmi, e' tutta la mattina che sbatto la testa contro sto problema, ormai non so piu' che pesci pigliare..

Grazie mille!