Salve!

Ho un problema nella creazione di una funzione, mi spiego meglio:

quello che voglio fare e' creare una funzione che, associata ad un trigger, in seguito all'inserimento di una tupla nella tabella richiesta_accesso controlla che l'utente la cui matricola compare in richiesta_accesso abbia il permesso per accedere al dato locale e, in caso affermativo, inserisca una nuova tupla nella tabella accesso con stato_accesso = 'consentito', altrimenti 'negato'.
Voglio inoltre sollevare un'eccezione se si sono superati i 3 rifiuti giornalieri.

Molto brevemente le tabelle che coinvolgo:

UTENTE(MATR, N_TESSERA, ...)
RICHIESTA_ACCESSO(MATR_UT, DATA_A, ORA_A, COD_LOC , GIORNO_A)
PERMESSO(MATR, COD_LOC , TIPOLOGIA, ID_ORARIO)
ORARIO (ID_ORARIO, GIORNO H_INIZIO, H_FINE)

Ora, GIORNO e' di tipo CHAR(3), conterra' ovvero 'lun', 'mar' eccetera, data_a e' di tipo DATE invece.

Quello che fo' nella funzione e' estrarre le varie informazioni di cui ho bisogno come il codice del locale a cui accedo, numero di tessera eccetera, estrarre gli orari di inizio e fine del permesso per quel dato giorno e controllare se l'ora nella richiesta di accesso e' compresa tra questi.

Il codice della funzione e' questo:

codice:
CREATE FUNCTION controllo_accesso() RETURNS trigger AS $controllo_accesso$
	    DECLARE
		D1 DATE;
		D2 CHAR;
		M1 CHAR;
                M2 CHAR;
		L1 CHAR;
		T1 TIME;
		T2 TIME;
		T3 TIME;
		S1 NUMERIC;
		S2 NUMERIC;
	    BEGIN
		SELECT data_a INTO D1, giorno_a INTO D2, matr_ut INTO M2, ora_a INTO T1, cod_loc INTO L1, n_tessera INTO S1
		FROM richiesta_accesso, utente
		WHERE matr_ut = NEW.matr_ut AND
		    matr_ut = utente.matr;
		
		SELECT h_inizio INTO T2, h_fine INTO 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
	            INSERT INTO accesso
		    VALUES (L1, D1, T1, 'consentito', S1);
	        ELSE 
	            INSERT INTO accesso
		    VALUES (L1, D1, T1, 'negato', S1);
		    SELECT COUNT(*) INTO S2
		    FROM accesso
		    WHERE stato_accesso = 'negato' AND
			data_a = D1
		    GROUP BY data_a;

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

	        END IF;
	    END;
	$controllo_accesso$ LANGUAGE plpgsql;


CREATE TRIGGER GESTIONE_ACCESSO
	AFTER INSERT ON richiesta_accesso
	FOR EACH ROW EXECUTE PROCEDURE controllo_accesso();
Quando eseguo la query per crearla l'errore e' il seguente:

ERROR: "giorno_a" is not a scalar variable
CONTEXT: compilation of PL/pgSQL function "controllo_accesso" near line 12

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

ERROR: "giorno_a" is not a scalar variable
Stato SQL: 42601
Contesto: compilation of PL/pgSQL function "controllo_accesso" near line 12
Eppure non riesco a capire cosa non vada in giorno_a..

Grazie mille per l'attenzione!