2011-10-27 1 views
2

Everytime appeler cette procédure stockée je reçois cette erreur:sélectionnez Utiliser dans la variable locale et déclaration préparée dans une base MySQL

#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 'NULL' at line 1 

Ce qui semble être le problème?

Voici le code:

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `singledb`.`TOUR_TRANSFER`$$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `TOUR_TRANSFER`() 
BEGIN 

BEGIN -- for rubric table 
      DECLARE tblRubric_rubric_id INT; 
      SET @qry = concat('SELECT count(*) into ',tblRubric_rubric_id,' FROM zerodb2.tour_template'); 
      PREPARE statement FROM @qry; 
      EXECUTE statement; 

      SELECT tblRubric_rubric_id; 
END; 
END$$ 

DELIMITER ; 
+0

Qu'est-ce exactement ce que vous essayez de faire, je pense que je peux aider. Obtenir le nombre d'une requête et juste retourner cela? – Ray

+0

@Ray Je veux juste assigner une valeur à une variable locale en utilisant select into dans une instruction préparée. Mais j'ai découvert qu'il ne fonctionnera pas avec les variables locales. Voir http://bugs.mysql.com/bug.php?id=15263 – kaz

+0

Cela fonctionne avec les variables locales. Je comprends ce que vous essayez de faire, mais il n'est pas nécessaire de le sélectionner dans une variable locale dans une procédure stockée sauf si vous envisagez de faire quelque chose avec cette variable locale dans la procédure stockée. Où appelez-vous cette procédure stockée de PHP ou quelque chose? Si vous souhaitez accéder à ce "count (*)" tout ce que vous avez à faire est d'appeler l'instruction select. Vous n'êtes pas obligé de le sélectionner dans une variable. – Ray

Répondre

9

De http://bugs.mysql.com/bug.php?id=15263:

« marqueurs de paramètres peuvent être utilisés que si les valeurs données doivent apparaître, non pas pour SQL mots-clés, les identifiants, et ainsi de suite. »

Donc, nous ne pouvons pas faire:

PREPARE DE stmt « id SELECT INTO? DE t1 ';

Nous ne pouvons pas utiliser? au lieu de l'identifiant (nom de la variable).

Et lorsque vous utilisez le nom du paramètre:

PREPARE DE stmt 'id SELECT INTO débarrasser FROM t1';

dans la chaîne en cours de préparation, alors le serveur ne sait tout simplement pas à quoi se réfère cette instruction dans l'instruction que vous essayez de préparer. Vous pouvez essayer de le préparer en dehors de SP avec le même résultat :

mysql> préparer stmt de 'select id dans p de t1'; erreur 1327 (42000): variable non déclarée: p

Je viens d'utiliser la variable utilisateur, voir ci-dessous:

DROP PROCEDURE IF EXISTS `singledb`.`TOUR_TRANSFER`$$ 
CREATE DEFINER=`root`@`localhost` PROCEDURE `TOUR_TRANSFER`() 
BEGIN 
BEGIN -- for rubric table 
      -- DECLARE @tblRubric_rubric_id INT; 

      SET @tblRubric_rubric_id := 0; 
      SET @qry = 'SELECT count(*) into @tblRubric_rubric_id FROM zerodb2.tour_template'; 
      PREPARE statement FROM @qry; 
      EXECUTE statement; 
END; 
END$$ 
0

Vous avez eu beaucoup d'erreurs de syntaxe, je pense. C'est habituellement comment j'écris mes procédures stockées et elles fonctionnent. Essayez ceci jusqu'à présent. Fondamentalement, vous n'avez pas besoin de sélectionner le nombre dans cette variable temporaire si vous allez simplement sélectionner cette variable temporaire dans l'instruction suivante.

DELIMITER $$ 

DROP PROCEDURE IF EXISTS TOUR_TRANSFER; 
CREATE PROCEDURE TOUR_TRANSFER() 


BEGIN # for rubric table 
DECLARE tblRubric_rubric_id INT; 

SET @qry := CONCAT('SELECT count(*) FROM zerodb2.tour_template'); 
PREPARE statement FROM @qry; 
EXECUTE statement; 

#SELECT tblRubric_rubric_id; # i don't think this will work 

END$$ 

DELIMITER ; 
+0

Salut! Merci pour votre réponse! Mais ce que je veux faire est d'assigner une valeur à une variable en utilisant select into dans une instruction préparée. Je viens de découvrir que cela ne marchera pas vraiment avec les variables locales. Voici un extrait de http://bugs.mysql.com/bug.php?id=15263: "Les marqueurs de paramètres ne peuvent être utilisés que là où les valeurs de données doivent apparaître, pas pour les mots-clés, les identificateurs, etc., de SQL ." – kaz

Questions connexes