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:
Quando eseguo la query per crearla l'errore e' il seguente: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();
Eppure non riesco a capire cosa non vada in giorno_a..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
Grazie mille per l'attenzione!

