Visualizzazione dei risultati da 1 a 5 su 5

Discussione: store procedure MySql

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    16

    store procedure MySql

    Ciao
    Avevo qualche infarinatura in sql2000 di MS, ma ora usando MySql mi trovo con qualche problema, in particolare sulle StoreProcedures.
    questa store:
    codice:
    DELIMITER // 
    CREATE PROCEDURE prova (OUT tot INT,OUT c1 INT) 
      BEGIN 
      DECLARE cur2 CURSOR FOR SELECT count(*) FROM prove.old WHERE flag <> 0; 
      OPEN cur2; 
      FETCH cur2 INTO tot; 
      CLOSE cur2; 
      set c1 = tot; 
      END; // 
    DELIMITER ;
    e il successivo richiamo
    CALL prova(@tot,@c1);
    select @tot,@c1;
    risponde correttamente:
    +-------+-------+
    | @tot | @c1 |
    +-------+-------+
    | 33322 | 33322 |
    +-------+-------+
    1 row in set (0.00 sec)

    Se aggiungo un cursore nella SP, non funge neanche il codice precedente;
    codice:
    DELIMITER //
    CREATE PROCEDURE prova (OUT tot INT,OUT c1 INT, OUT c2 INT)
    BEGIN
    	DECLARE done 		INT;
    	DECLARE ip_start  	BIGINT;
    	DECLARE ip_to  		BIGINT;
    	DECLARE city_code  	INT;
    	DECLARE flag		TINYINT;
    
            DECLARE cur2 CURSOR FOR SELECT count(*) FROM prove.old WHERE flag <> 0;
            DECLARE cur1 CURSOR FOR SELECT * FROM prove.old WHERE flag <> 0;
            DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    		
    		OPEN cur2;
    		FETCH cur2 INTO tot;
    		CLOSE cur2;
    		
    	set c1 = 0;	set c2 = 0;	set done = 0;
    		
    	OPEN cur1;
    	REPEAT
    	  FETCH cur1 INTO ip_start,ip_to,city_code,flag;
    		  IF NOT done THEN
    						IF flag = 1 THEN 
    							SET c1 = c1 + 1; 
    							ELSE 
    							SET c2 = c2 + 1;
    						END IF;
    		
    		  END IF;
    	UNTIL done END REPEAT;
    	CLOSE cur1;
    
    END; //
    DELIMITER ;
    al richiamo:
    CALL prova(@tot,@c1,@c2);
    select @tot,@c1,@c2;
    la risposta è:

    mysql> CALL prova(@tot,@c1,@c2);
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    mysql> select @tot,@c1,@c2;
    +------+------+------+
    | @tot | @c1 | @c2 |
    +------+------+------+
    | 0 | 0 | 0 |
    +------+------+------+
    1 row in set (0.00 sec)

    perchè? dove sbaglio?
    grazie in anticipo
    JeanPaul

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    16

    risolto.....

    Ho fatto un po' di prove e sembra che 'flag' sia una parola riservata, cambiandola in '_flag' funziona tutto.
    PS. ma xkè non da errore se si usa una parola riservata?

  3. #3

    Re: risolto.....

    Originariamente inviato da JeanPaul
    Ho fatto un po' di prove e sembra che 'flag' sia una parola riservata, cambiandola in '_flag' funziona tutto.
    PS. ma xkè non da errore se si usa una parola riservata?
    flag non e' una parola riservata. Infatti nella prima store procedure funziona come nome di campo.

    Non ho letto tutto il secondo script ma la risposta query OK esclude la reserved word.

    Qui trovi l'elenco delle reserved words di mysql.

    http://dev.mysql.com/doc/refman/5.5/...ved-words.html

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    16

    Re: Re: risolto.....

    La presenza di 'flag' nella tabella non crea problemi, quindi:

    codice:
        SELECT count(*) FROM prove.old WHERE flag <> 0;
           e
        SELECT * FROM prove.old WHERE flag <> 0;
    funzionano senza problemi, crea invece problemi se dichiarata come variabile della SP, per far funzionare tutto ho dovuto modificare la dichiarazione e i relativi utilizzi:
    codice:
        DECLARE _flag		TINYINT;
    ...
    ...
    	  FETCH cur1 INTO ip_start,ip_to,city_code,_flag;
    ...
    ...
    	  IF _flag = 1 THEN
    Dopo questa modifica funziona tutto.
    Ora forse 'flag' non è una parola riservata, ma sta' di fatto che crea il problema senza segnalazioni di sorta.

  5. #5
    a parita' di nomi i dati si sovrascrivono. L'ultimo prevale sui precedenti.

    Se utilizzi un nome riservato devi inserirlo tra backtick alt+096 `flag` per notificare al server che si tratta di un nome e non di una reserved word. Ma e' sempre sconsigliato usare le parole riservate. Ma non era questo il tuo caso. Penso ad una sovrascrittura del campo flag

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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.