¿Cómo devuelve MySQL un conjunto de resultados de un procedimiento almacenado?

16

Estoy tratando de entender los procedimientos almacenados para usar en una aplicación web. Me parece que cualquiera que sea la última declaración en un procedimiento almacenado de MySQL parece ser lo que se trata como el conjunto de resultados de ese procedimiento. Desafortunadamente, parece que hay referencias en los documentos de MySQL que dicen que un procedimiento puede devolver múltiples conjuntos de resultados. ¿Cómo se desencadena este comportamiento? ¿Cómo puedo decirle al servidor MySQL que quiero explícitamente que solo se devuelva un conjunto de resultados?

(Por ejemplo, tengo una consulta que hace un SELECT y algunas inserciones. No quiero informar a los clientes sobre las inserciones, pero sí quiero que el cliente reciba el conjunto de resultados de SELECT ...)

Billy ONeal
fuente

Respuestas:

17

Cada instrucción SELECT que no se inserte en una tabla o una variable producirá un conjunto de resultados.

Si desea que su procedimiento almacenado devuelva solo un conjunto de resultados, asegúrese de tener solo una instrucción SELECT. Si tiene otras instrucciones SELECT, asegúrese de que inserten resultados en una tabla o variable.

ACTUALIZACIÓN
Aquí hay ejemplos de procedimientos almacenados.

Este procedimiento almacenado devolvería un conjunto de resultados:

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 ;

Este procedimiento almacenado devolvería dos conjuntos de resultados:

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
fuente
Ah, entonces, si entra en una tabla o variable, ¿no se incluye como resultado? ¿Cómo se accede a eso? utilizando, por ejemplo, SELECT INTO?
Billy ONeal
Sí a la primera pregunta. No tengo claro tu segunda pregunta. Si quiero guardar un valor en una variable local dentro del procedimiento almacenado, corro algo como esto: SELECT column_name LIMIT 1 INTO local_variable_name;.
dabest1
Consulta de ejemplo anterior debería haber sido: SELECT column_name FROM table LIMIT 1 INTO local_variable_name;.
dabest1
si quiero conseguir variable después stored_procedure_name llamada de otro procedimiento almacenado, no puedo fijar resultado = stored_procedure_name llamada () ;, la forma de resolverlo si uso del cursor, DECLARE CURSOR c_dept PARA get_info_user_visitstatistics de llamada () error de sintaxis?
Amitābha