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

Discussione: MySql Stored Procedure

  1. #1

    MySql Stored Procedure

    Salve a tutti. Sto cercando di capire come funzionano le stored procedure.

    Nel codice che segue ottengo un errore dato dalla dichiarazione dell'handler che vorrei usare per intercettare un'eccezione per poter poi eseguire il rollback o il commit.

    Sapete dirmi perche?

    Ho seguito il manuale di Mysql 5 come reference per la declare dell'handler.

    codice:
    DELIMITER $$
    
    DROP PROCEDURE IF EXISTS mysql.prova $$
    CREATE PROCEDURE mysql.prova()
    BEGIN
    
    DECLARE error BOOLEAN DEFAULT FALSE;
    
    SET AUTOCOMMIT = 0;
    
    DECLARE CONTINUE HANDLER FO SQLEXCEPTION SET error = TRUE;
    
    DROP DATABASE IF EXISTS dbprova;
    CREATE DATABASE dbprova;
    CREATE TABLE dbprova.table1 ( nome char(10), cognome char(10));
    INSERT INTo dbprova.table1 SELECT * FROM dbold.pippo;
    
    IF error THEN ROLLBACK;
    ELSE COMMIT;
    END IF;
    
    END; $$
    
    DELIMITER ;
    L'errore che mi porta e' questo:

    codice:
    You have an error in your SQL syntax; Catch the manual the corrisponds to your 
    Mysql server version for the right syntax to use near '' DECLARE  CONTINUE 
    HANDLER FO SQLEXCEPTION SET error = TRUE; // scritto a mano d ame :o [...]
    Ringrazio in anticipo quanti interverranno .

  2. #2


    help i need somebody....

  3. #3
    L'errore è li dove ti dice:
    codice:
    DECLARE CONTINUE HANDLER FO  SQLEXCEPTION SET error = TRUE;
    hai mancato la "R":
    codice:
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET error = TRUE;

  4. #4
    no no non e' quello l'errore

    l'ho copiato al volo su un pezzo di carta il codice perche il pc dal quale scrivo e' in rete, il server e' in attesa di switch quindi e' momentaneamente isolato

    li effettivamente la R ci va

  5. #5
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Sarebbe il caso che il codice che posti qui fosse ESATTAMENTE quello che ti dà i problemi, altrimenti è come giocare agli indovinelli.

    Comunque mi pare che tu abbia una DECLARE un po' troppo in basso. Devono essere le prime istruzioni della s.p.

  6. #6
    Originariamente inviato da luca200
    Comunque mi pare che tu abbia una DECLARE un po' troppo in basso. Devono essere le prime istruzioni della s.p.
    si è vero, quindi prova così:
    codice:
    DELIMITER $$
    
    DROP PROCEDURE IF EXISTS mysql.prova $$
    CREATE PROCEDURE mysql.prova()
    BEGIN
    
    DECLARE error BOOLEAN DEFAULT FALSE;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET error = TRUE;
    
    SET AUTOCOMMIT = 0;
    
    DROP DATABASE IF EXISTS dbprova;
    CREATE DATABASE dbprova;
    CREATE TABLE dbprova.table1 ( nome char(10), cognome char(10));
    INSERT INTo dbprova.table1 SELECT * FROM dbold.pippo;
    
    IF error THEN ROLLBACK;
    ELSE COMMIT;
    END IF;
    
    END; $$
    
    DELIMITER ;
    dovrebbe funzionare, se non funziona così prova a scaricarti un programma di gestione database (tipo EMS SQL Manager 2005 for MySQL) e prova da li...perchè l'ho appena testata così e funziona.

    Questo è il DDL funzionante che ottengo:
    codice:
    CREATE PROCEDURE `prova`()
        NOT DETERMINISTIC
        CONTAINS SQL
        SQL SECURITY DEFINER
        COMMENT ''
    BEGIN
    
    DECLARE error BOOLEAN DEFAULT FALSE;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET error = TRUE;
    
    SET AUTOCOMMIT = 0;
    
    DROP DATABASE IF EXISTS dbprova;
    CREATE DATABASE dbprova;
    CREATE TABLE dbprova.table1 ( nome char(10), cognome char(10));
    INSERT INTo dbprova.table1 SELECT * FROM dbold.pippo;
    
    IF error THEN ROLLBACK;
    ELSE COMMIT;
    END IF;
    
    END;

  7. #7
    avete ragione.... copiato ed incollato codice e errore....

    Stored Procedure:
    codice:
    DELIMITER $$
    
    DROP PROCEDURE IF EXISTS `mysql`.`Prova`$$
    CREATE PROCEDURE `mysql`.`Prova` ()
    BEGIN
    	DECLARE errore BOOLEAN DEFAULT FALSE;
    	
    	SET AUTOCOMMIT = 0;
    	
    	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET errore = TRUE;	
    		
    	
    	DROP DATABASE IF EXISTS db_prova;
    	CREATE DATABASE db_prova;
    	CREATE TABLE db_prova.pdc (nome char(10), cognome char(10));
    	INSERT INTO db_prova.pdc SELECT * FROM db_old.pippo;
    	
    	
    	IF errore THEN ROLLBACK; ELSE COMMIT;
    	END IF;
    
    END; $$
    
    DELIMITER ;
    Errore:
    codice:
    Error while execeuting query: CREATE PROCEDURE `mysql`.`Prova` ()
    BEGIN
    	DECLARE errore BOOLEAN DEFAULT FALSE;
    	
    	SET AUTOCOMMIT = 0;
    	
    	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET errore = TRUE;	
    		
    	
    	DROP DATABASE IF EXISTS db_prova;
    	CREATE DATABASE db_prova;
    	CREATE TABLE db_prova.pdc (nome char(10), cognome char(10));
    	INSERT INTO db_prova.pdc SELECT * FROM db_old.pippo;
    	
    	
    	IF errore THEN ROLLBACK; ELSE COMMIT;
    	END IF;
    
    END; :
    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 'DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET errore = TRUE;	
    		
    	
    	DROP DATABAS' at line 7 (errno: 1064)
    Click 'Ignore' if you'd like to have this error ignored until the end of the script.
    Versione Server Mysql : 5.0.32 @ Debian

    EDIT: visto ora reply...provo e vi dico

  8. #8
    abbiamo postato contemporaneamente, leggi l'ultimo post che ho messo

  9. #9
    allora, spostando la dichiarazione dell'handler sopra mi restituisce un errore sul DELIMITER ma mi crea la SP e funziona, il problema e' il rollback che non viene eseguito.

    crea il db, crea la table poi cerca di copiare i dati, che ovviamente non gli faccio trovare per generare l'errore, ma non esegue comuqnue il roll....infatti ho il db db_prova li bello bello...


  10. #10
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    http://database.html.it/guide/lezion...azioni-e-lock/

    Ricordiamo anche che alcuni tipi di operazioni non sono annullabili: in generale tutte quelle che creano, eliminano, o alterano la struttura di database e tabelle. È bene quindi evitare di includere in una transazione tali operazioni, che fra l'altro, nella maggior parte dei casi, causano una implicita COMMIT.

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.