Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    10

    [MYSQL] Problema con Stored Procedure

    Salve a tutti,

    volevo chiedervi un aiuto perché ho un problema con una stored procedure e mi serve assolutamente risolverla per l'esame di Basi di Dati.

    Innanzitutto vi spiego il mio problema…io ho creato un trigger che controlla che prima di inserire un record in una tabella controlla se ci sono duplicati. Se ce ne sono, non inserisce alcun record, altrimenti continua tranquillo. Il codice che ho scritto e' questo:

    codice:
    CREATE TRIGGER duplicateLogs BEFORE INSERT
    ON users_log FOR EACH ROW BEGIN
     CALL duplicateRows(NEW.IDUser,NEW.IDFilm,NEW.date_visit,@result);
    END;
    |
    
    CREATE PROCEDURE duplicateRows(IN iduser INT, IN idfilm INT, IN data_visita DATE, OUT result INT)
    BEGIN
    SET result = 0;
    SELECT COUNT(IDUser) INTO result FROM users_log WHERE IDUser=iduser AND IDFilm=idfilm AND CAST(date_visit AS DATE)=data_visita;
    END;
    |

    il codice è ancora da completare perché mi sono bloccato già nella select della stored procedure. Purtroppo quando la vado ad eseguire, la selet non mi restituisce il numero di record che rispettano la condizione, anzi non mi spiego proprio cosa conti. A volte mi restituisce ad esempio 6 quando nella tabella ci sono massimo 5 righe.
    Ho provato a fare il WHERE anche con una sola condizione ma e' come se non me le calcolasse.
    Dico subito che il passaggio di parametri e' giusto, ho controllato e i valori li passa correttamente. Io mi ci sto sbattendo la testa da giorni ma non trovo soluzione. Qualcuno di voi ha qualche idea sul problema?
    Grazie anticipatamente per una risposta.

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Definisci un indice univoco composito sui tre campi e amen.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    10
    Si tu hai ragione,il problema e' che per l'esame ho bisogno di creare una Stored Procedure e non avendo molte idee di implementazione mi e' venuta da realizzare solo questa :P

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Creati una tabella errore in cui inserirai solo un valore (ad es. 1) definito come chiave primaria. Ti servirà per bloccare l'inserimento del record.

    Poi con un trigger risolvi.

    codice:
    delimiter //
    create trigger duplicateLogs
    before insert on users_log
    for each row
    begin
    declare righe integer;
    select count(*) into righe from users_log where iduser = new.iduser and idfilm = new.idfilm and date_visit = new.date_visit;
    if righe > 0 then
      insert into errore values (1);
    end if;
    end;
    //
    delimiter ;

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    10
    Chiedo scusa ma non capisco come potrei sfruttare il valore dentro la tabella errore per bloccare la query. Non e' che potresti spiegarmelo?

    P.S. ho controllato anche ad inserire il tuo trigger ma il valore della variabile righe e' sempre uguale a 0 anche se ci sono 5 righe uguali -.- Io proprio non me lo riesco a spiegare perchè fa così

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Come ti ho già scritto aggiungi una tabella errore con un solo campo primary key (basta un tinyint) e un solo record cui assegnerai il valore 1.

    Il trigger che ti ho scritto verificherà i tre valori passati tramite la query di insert e conterà quante righe sono già presenti nella tabella con quegli stessi identici valori.
    Nel caso non ve ne siano avverrà l'inserimento, in caso contrario verrà lanciata la insert nella tabella errore del valore 1 che, essenso già presente e definito come chiave primaria, genererà un errore lasciando l'altra tabella intatta.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    10
    Ah ok capito. Pero' ho ancora quel problema che anche nel tuo trigger il valore della variabile e' sempre uguale a 0 anche se ci sono 5 righe uguali. Non ne capisco proprio il motivo.

    Ho rimodificato un attimo il trigger perche' il campo date_visit e' di tipo DATETIME. Il codice e' il seguente:

    codice:
    DROP TRIGGER IF EXISTS duplicateLogs//
    
    create trigger duplicateLogs
    before insert on users_log
    for each row
    begin
    declare righe integer;
    select count(*) into righe from users_log where IDUser = NEW.IDUser and IDFilm = NEW.IDFilm and CAST(date_visit AS DATE) = NEW.date_visit;
    if righe > 0 then
      insert into error values (1);
    end if;
    end;
    La cosa che mi fa ridere (per non piangere) e' che se io faccio questa query:

    codice:
    select count(*)  from users_log where IDUser = 2 and IDFilm = 82 and CAST(date_visit AS DATE) = "2010-06-12";
    il count fa il conteggio esatto mentre dentro il trigger mi da' sempre 0. Perche' questa cosa?

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Se tenti di inserire un record con gli stessi valori di quei 5 immagino che l'inserimento non venga permesso.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    10
    invece me lo permette l'inserimento perchè la variabile righe per lui e' sempre uguale a 0 quindi non entra mai nell'if e non mi blocca l'inserimento. Infatti se io nell'if invece di fare "righe > 0" metto "righe >= 0" mi entra nell'if e mi da' l'errore. Non so se mi sono spiegato...

  10. #10
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Posta il dump sia della struttura della tabella che dei dati che hai già inserito.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.