Como o MySQL retorna um conjunto de resultados de um procedimento armazenado?

16

Estou tentando entender os procedimentos armazenados para uso em um aplicativo da web. Parece-me que, seja qual for a última declaração em um procedimento armazenado do MySQL, parece ser o que é tratado como o conjunto de resultados desse procedimento. Infelizmente, porém, parece que existem referências nos documentos do MySQL que dizem que um procedimento pode retornar vários conjuntos de resultados. Como esse comportamento é acionado? Como posso dizer ao servidor MySQL que desejo explicitamente apenas um conjunto de resultados retornado?

(Por exemplo, tenho uma consulta que faz um SELECT e algumas inserções. Não quero informar os clientes sobre as inserções, mas quero que o cliente receba o conjunto de resultados do SELECT ....)

Billy ONeal
fonte

Respostas:

17

Cada instrução SELECT que não é inserida em uma tabela ou variável produzirá um conjunto de resultados.

Se você deseja que seu procedimento armazenado retorne apenas um conjunto de resultados, verifique se você possui apenas uma instrução SELECT. Se você tiver outras instruções SELECT, verifique se elas inserem resultados em uma tabela ou variável.

ATUALIZAÇÃO
Aqui estão exemplos de procedimentos armazenados.

Este procedimento armazenado retornaria um 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 procedimento armazenado retornaria dois 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
fonte
Ah, então, se entrar em uma tabela ou variável, não será incluído como resultado? Como alguém acessa isso; usando, por exemplo, SELECT INTO?
Billy ONeal
Sim para a primeira pergunta. Não estou claro sobre sua segunda pergunta. Se eu quiser salvar um valor em uma variável local dentro do procedimento armazenado, eu corro algo como isto: SELECT column_name LIMIT 1 INTO local_variable_name;.
dabest1
Consulta de exemplo acima deveria ter sido: SELECT column_name FROM table LIMIT 1 INTO local_variable_name;.
dabest1
se eu quiser obter variável depois Stored_Procedure_Name chamada de outro procedimento armazenado, eu não posso definir result = Stored_Procedure_Name call () ;, como resolvê-lo se eu usar cursor, CURSOR DECLARE c_dept PARA get_info_user_visitstatistics de chamada () erro de sintaxe?
Amitābha