web-dev-qa-db-fra.com

mysql procédure stockée: paramètre out

J'ai une procédure stockée mysql à partir de cela ( google book ), et voici un exemple:

DELIMITER $$

DROP PROCEDURE IF EXISTS my_sqrt$$
CREATE PROCEDURE my_sqrt(input_number INT, OUT out_number FLOAT)
BEGIN
    SET out_number=SQRT(input_number);
END$$

DELIMITER ;

La procédure compile bien. (J'utilise le navigateur de requêtes MySQL dans Ubuntu).

Cependant quand j'appelle la procédure:

CALL my_sqrt(4,@out_value);

(également dans le navigateur de requêtes)

Cela retourne une erreur:

(1064) check the manual that correspond to the...

Pourquoi cet exemple ne fonctionne-t-il pas?

26
domagojk

Impossible de répliquer. Cela a bien fonctionné pour moi:

mysql> CALL my_sqrt(4, @out_value);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @out_value;
+------------+
| @out_value |
+------------+
| 2          | 
+------------+
1 row in set (0.00 sec)

Peut-être devriez-vous coller tout le message d'erreur au lieu de le résumer.

35
chaos

Vous devez avoir utiliser la signature correcte pour le paramètre d'entrée * IN manque dans le code ci-dessous.

CREATE PROCEDURE my_sqrt(IN input_number INT, OUT out_number FLOAT)
6
KuldeeP ChoudharY

Je sais que c'est un vieux fil de discussion, mais si quelqu'un cherche une réponse à la question de savoir pourquoi ses procédures ne fonctionnent pas dans le workbench et pense que le seul résultat est "Requête annulée" ou quelque chose du genre sans indications:

la sortie avec des erreurs ou des problèmes est cachée. Je ne sais pas pourquoi, je comprends que c'est agaçant, mais c'est là. déplacez simplement votre curseur au-dessus de la ligne au-dessus du message, il tournera en une double flèche (vers le haut et le bas). Vous pourrez ensuite cliquer et faire glisser cette ligne, puis vous verrez une console avec le message que vous avez manqué!

2
SomeOne_1
SET out_number=SQRT(input_number); 

Au lieu de cette écriture:

select SQRT(input_number); 

Veuillez ne pas écrire SET out_number et votre paramètre d'entrée devrait être:

PROCEDURE `test`.`my_sqrt`(IN input_number INT, OUT out_number FLOAT) 
1
Noby Nirmal

J'ai juste essayé d'appeler une fonction dans un terminal plutôt que dans MySQL Query Browser et ça marche ... donc on dirait que je fais quelque chose de mal dans ce programme ...

Je ne sais pas quoi depuis que j'ai appelé certaines procédures auparavant avec succès (mais là où aucun paramètre n'est sorti) ...

Pour celui-ci j'étais entré

CALL my_sqrt(4,@out_value);
SELECT @out_value;

Et il en résulte une erreur:

Vous avez une erreur dans votre syntaxe SQL; Consultez le manuel correspondant à la version de votre serveur MySQL pour le bonne syntaxe à utiliser près de 'SELECT @out_value 'à la ligne 2

Étrangement, si j'écris seulement:

CALL my_sqrt(4,@out_value); 

Le message de résultat est: "Requête annulée"

Je suppose que pour le moment je n'utiliserai que le terminal ...

1
domagojk

Si vous appelez depuis une procédure stockée, n'utilisez pas @. Dans mon cas, il retourne 0 

CALL SP_NAME (L_OUTPUT_PARAM) 

0
www.shipshuk.com