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

    [PostgreSQL] problema persistenza variabili funzioni

    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!

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    34
    Up..nessuno ha una vaga idea del perche' cio' accada..? Non riesco ancora a saltarci fuori u.u

    Grazie mille^^

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.