Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Problema con php e mysql

    Salve a tutti, sono uno studente in difficoltà e chiedo il vostro aiuto.
    Devo fare degli esercizi in preparazione ad un esame e non ne vengo a capo.
    ad esempio....
    Data una tabella Studenti(Matr,Nome,Cognome) scrivere il codice per creare un trigger che impedisca l’inserimento di uno studente che abbia matricola nulla o uguale a quella di un altro
    studente.
    Questo è quello che sono riuscito a fare ma mi da sempre errori...
    codice:
    CREATE TRIGGER Inserimento before INSERT ON Studenti
    BEGIN
    	declare i_matricola number;
    	i_matricola:=123456;
    	declare trovato boolean;
    	trovato:=false;
    	IF (i_matricola is not null) then
    		FOR EACH ROW (select Matr from Studenti)
    		BEGIN
    			IF (i_matricola=NEW.Matr) then 
    				trovato:=true;
    			end if;
    			if (trovato is not null) then
    				INSERT INTO Studenti VALUES(i_matricola, "gino", "paoli")
    			end if;
    		END
    	end if;
    END
    Mi da errori persino sulle declare
    Che c'è che non va?

  2. #2
    Utente di HTML.it L'avatar di r1cky`
    Registrato dal
    Feb 2007
    Messaggi
    431
    Ciao collega, provo ad abbozzare velocemente il trigger come dovrebbe essere secondo me:

    codice:
    CREATE TRIGGER Inserimento before INSERT ON Studenti FOR EACH ROW
    trig: BEGIN
    
    	declare trovato tinyint;
    
    	/* Se la matricola è nulla blocchiamo l'inserimento*/
        IF NEW.Matr is null then
          leave trig;
        end if;
    
    	/*Contiamo quanti studenti ci sono con quella matricola*/
    	select count(*) into trovato from Studenti where matr = new.matr;
    	
    	/*Se ce ne sono più di 0 vuol dire che esiste già, percui blocchiamo l'inserimento */
    	
    	if trovato > 0 then
    		leave trig;
    	end if;
    
    	/*Se arriva a questo punto vuol dire che è tutto ok percui può inserire lo studente*/
    END
    Osservazioni:

    -Tieni conto che non c'è bisogno che fai tu la query, se il trigger viene chiamato è perchè l'insert è già stato chiamato, se vuoi concluderlo devi solo fare in modo che il trigger non blocchi la esecuzione.

    -Per assegnare un valore a una variabile che dichiari devi usare la seguente sintassi:

    DECLARE var INT DEAFULT 0;

    -Per assegnare un valore a una variabile ti conviene usare la sintassi:

    SET var = 0;

    -Le condizioni negli if non richiedono le parentesi

  3. #3
    Grazie mille per la risposta, molto esauriente. Non so bene pechè ma con phpmyadmin se faccio importa del file in cui ho il trigger (succedeva anche con il mio prima) mi da errore di sintassi nella declare, non so perchè. So solo che ieri ci ho perso la giornata

  4. #4
    Utente di HTML.it L'avatar di r1cky`
    Registrato dal
    Feb 2007
    Messaggi
    431
    Se devi scrivere o editare trigger o stored procedure phpmyadmin non è molto comodo.

    Scarica sqlyog community, io mi sono trovato bene:
    http://www.webyog.com/en/downloads.php#sqlyog

  5. #5
    Grazie lo provo subito. Una domanda, quando faccio leave trig che succede di preciso? Cioè io faccio una insert, poi scatta il grilletto che mi porta all'interno del trigger, e la insert viene fatta solo se si arriva alla corretta terminazione del trigger?

    EDIT: IL programma che mi hai consigliato è ottimo

  6. #6
    Già che ci sono provo a chiedere un'ultima cosa.
    ho quest'altro esercizio:
    codice:
    Data la tabella Conti(Id,Saldo), inizialmente vuota e le transazioni
    T1
    INSERT INTO Conti VALUES (1, 100);
    INSERT INTO Conti VALUES (2, 100);
    SELECT AVG(Saldo) FROM Conti;
    T2
    INSERT INTO Conti VALUES (3, 400);
    SELECT AVG(Saldo) FROM Conti;
    fornire i possibili valori ritornati da T2 (con livello di serializzabilit`a massimo).
    Ora ho provato ad eseguirla con il programma consigliato (finalmente...) e mi da come risultato 100. Cioè mi da 100 se faccio così:
    codice:
    START TRANSACTION;
    	INSERT INTO Conti VALUES (1, 100);
    	INSERT INTO Conti VALUES (2, 100);
    	SELECT AVG(Saldo) FROM Conti;
    COMMIT;
    
    START TRANSACTION;
    	SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    	INSERT INTO Conti VALUES (3, 400);
    	SELECT AVG(Saldo) FROM Conti INTO media;
    COMMIT;
    E' giusto?
    Questo è dovuto al fatto che il livello di isolamente è serializable quindi dovrei attendere che T1 rilasci la tabella per poter eseguire? Però è strano perchè i valori vengono inseriti tutti e tre nel database

  7. #7
    Utente di HTML.it L'avatar di r1cky`
    Registrato dal
    Feb 2007
    Messaggi
    431
    Non saprei, non sono esperto di transazioni, mi dispiace.
    Comunque credo che tu debba fare,

    codice:
    select media
    per visualizzare la nuova media, visto che l'hai messa li dentro

    Una domanda, quando faccio leave trig che succede di preciso? Cioè io faccio una insert, poi scatta il grilletto che mi porta all'interno del trigger, e la insert viene fatta solo se si arriva alla corretta terminazione del trigger?
    Esatto! E con il leave tu blocchi l'esecuzione del trigger e di conseguenza la insert

  8. #8
    No beh mi viene visualizzatto avg(conti)... solo che non ho capito troppo bene come funziona il discorso

  9. #9
    Ad ogni modo mi sto avvicinando alla soluzione del malvagio trigger...
    Certo che con delle slide serie ed un compilatore come quello del c++ avrei già risolto da un pezzo...
    codice:
    CREATE TRIGGER Inserimento BEFORE INSERT ON Studenti FOR EACH ROW
    trig: BEGIN
    	DECLARE trovato INT
    	/*Se la matricola è nulla blocchiamo l'inserimento*/
    	IF NEW.Matr IS NULL THEN
    		LEAVE trig
    	END IF
    	/*Contiamo quanti studenti ci sono con quella matricola*/
    	SELECT COUNT(*) INTO trovato FROM Studenti WHERE matr = new.matr;
    	/*Se ce ne sono più di 0 vuol dire che esiste già, percui blocchiamo l'inserimento */
    	IF (trovato > 0) THEN
    		LEAVE trig
    	END IF
    	/*Se arriva a questo punto vuol dire che è tutto ok percui può inserire lo studente*/
    END
    Mi dice:
    codice:
    Error Code : 1064
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF NEW.Matr is null then
    		leave trig
    	end if
    	/*Contiamo quanti studenti ci son' at line 5
    
    Execution Time : 00:00:00:000
    Transfer Time  : 00:00:00:000
    Total Time     : 00:00:00:000
    
    Error Code : 1064
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'if (trovato > 0) then
    		leave trig
    	end if
    	/*Se arriva a questo punto vuol dire' at line 2
    
    Execution Time : 00:00:00:000
    Transfer Time  : 00:00:00:000
    Total Time     : 00:00:00:000

  10. #10
    Utente di HTML.it L'avatar di r1cky`
    Registrato dal
    Feb 2007
    Messaggi
    431
    Mancano i ;

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.