Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    34

    [postgresql] creazione funzione

    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!

  2. #2
    Utente di HTML.it L'avatar di comas17
    Registrato dal
    Apr 2002
    Messaggi
    6,522
    Non c'entra niente (almeno sembra) ma hai un "matr_ut INTO M2" e non hai definito un M2 ma solo un M1...
    E' un refuso nel post o nella funzione ?

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    34
    Ehm giusto..primo errore trovato:P

    Grazie^^

    Purtroppo non era rilevante ai fini del problema del post, ho provato a riavviare la query ma l'errore persiste..pero' grazie

    Edit: modificato il codice

  4. #4
    Utente di HTML.it L'avatar di comas17
    Registrato dal
    Apr 2002
    Messaggi
    6,522
    Prova a vedere qui: http://bytes.com/topic/postgresql/an...variable-error

    indicano una sintassi un po' diversa dalla tua

    "select into var1, var2, var3 field1, field2, field3 FROM tab-name ..."

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    34
    Oki, risolto..

    A beneficio di quelli che potrebbero avere lo stesso problema, la corretta sintassi del SELECT INTO e':

    codice:
    SELECT data_a, giorno_a, matr_ut, ora_a, cod_loc, n_tessera INTO D1, D2, M2, T1, L1, S1

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    34
    Riciclo il topic per un altro problema con una funzione:

    Questo e' il pezzo di codice incriminato:

    codice:
    	    IF STATO != 'libero' THEN  --occupato o null, ovvero non c'e' il posto..
    		RAISE EXCEPTION 'Posto non disponibile, impossibile prenotare';
    		ELSE
    		UPDATE posto_lavoro_prenot SET
    		data_p = D1, stato = 'prenotato';
    	    END IF;
    E questo l'errore quando avvio la query per l'inserimento della funzione in db:

    (anche qui il ^ punta a $2, nel copiare qui non riesco a renderlo)
    ERROR: syntax error at or near "$2"
    LINE 1: UPDATE posto_lavoro_prenot SET data_p = $1 , $2 = 'prenot...
    ^
    QUERY: UPDATE posto_lavoro_prenot SET data_p = $1 , $2 = 'prenotato'
    CONTEXT: SQL statement in PL/PgSQL function "controllo_prenotazione" near line 25

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

    ERROR: syntax error at or near "$2"
    Stato SQL: 42601
    Contesto: SQL statement in PL/PgSQL function "controllo_prenotazione" near line 25
    Perche' accade cio' ç_ç
    La sintassi dell'update e' corretta, fuori dal contesto della funzione la query esegue..non so che pesci pigliare u.u

    Grazie in anticipo!

  7. #7
    Originariamente inviato da stefo_11
    Riciclo il topic per un altro problema con una funzione:
    .
    .
    .
    questa è una cosa che non si fa, altrimenti si crea una GRANDE confusione

    gentilmente apri un nuovo thread
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.