Comment MySQL renvoie-t-il un jeu de résultats à partir d'une procédure stockée?

16

J'essaie de me familiariser avec les procédures stockées à utiliser dans une application Web. Il me semble que quelle que soit la dernière instruction dans une procédure stockée MySQL, c'est ce qui est traité comme l'ensemble de résultats de cette procédure. Malheureusement cependant, il semble qu'il y ait des références dans les documents MySQL qui disent qu'une procédure peut retourner plusieurs jeux de résultats. Comment ce comportement est-il déclenché? Comment puis-je dire au serveur MySQL que je souhaite explicitement qu'un seul jeu de résultats soit renvoyé?

(Par exemple, j'ai une requête qui fait un SELECT et quelques insertions. Je ne veux pas parler des insertions aux clients, mais je veux que le client reçoive le jeu de résultats du SELECT ....)

Billy ONeal
la source

Réponses:

17

Chaque instruction SELECT qui ne s'insère pas dans une table ou une variable produira un jeu de résultats.

Si vous souhaitez que votre procédure stockée renvoie un seul jeu de résultats, assurez-vous que vous n'avez qu'une seule instruction SELECT. Si vous avez d'autres instructions SELECT, assurez-vous qu'elles insèrent des résultats dans une table ou une variable.

MISE À JOUR
Voici des exemples de procédures stockées.

Cette procédure stockée renverrait un jeu de résultats:

DELIMITER ;;
CREATE DEFINER=CURRENT_USER PROCEDURE stored_procedure_name()
BEGIN
    DECLARE local_variable_name INT;

    SELECT column_name FROM table_1 LIMIT 1 INTO local_variable_name;

    SELECT * FROM table_1;
END;;
DELIMITER ;

Cette procédure stockée retournerait deux jeux de résultats:

DELIMITER ;;
CREATE DEFINER=CURRENT_USER PROCEDURE stored_procedure_name()
BEGIN
    DECLARE local_variable_name INT;

    SELECT column_name FROM table_1 LIMIT 1 INTO local_variable_name;

    SELECT * FROM table_1;

    SELECT * FROM table_2;
END;;
DELIMITER ;
dabest1
la source
Ah, donc si elle va dans une table ou une variable, elle ne sera pas incluse en conséquence? Comment accède-t-on à cela; en utilisant par exemple SELECT INTO?
Billy ONeal
Oui à la première question. Je ne suis pas clair sur votre deuxième question. Si je veux enregistrer une valeur dans une variable locale à partir de la procédure stockée, je lance quelque chose comme ceci: SELECT column_name LIMIT 1 INTO local_variable_name;.
dabest1
Requête exemple ci - dessus aurait dû être: SELECT column_name FROM table LIMIT 1 INTO local_variable_name;.
dabest1
si je veux obtenir une variable après l'appel store_procedure_name d'une autre procédure stockée, je ne peux pas définir result = call stored_procedure_name () ;, comment le résoudre? si j'utilise le curseur, DECLARE c_dept CURSOR FOR call get_info_user_visitstatistics () erreur de syntaxe
Amitābha