Как MySQL возвращает набор результатов из хранимой процедуры?

16

Я пытаюсь разобраться с хранимыми процедурами для использования в веб-приложении. Мне кажется, что, независимо от того, что последний оператор находится в хранимой процедуре MySQL, он выглядит как набор результатов этой процедуры. К сожалению, кажется, в документах MySQL есть ссылки, в которых говорится, что процедура может возвращать несколько наборов результатов. Как это поведение срабатывает? Как я могу сказать серверу MySQL, что явно хочу, чтобы возвращался только один набор результатов?

(Например, у меня есть запрос, который выполняет SELECT и несколько вставок. Я не хочу рассказывать клиентам о вставках, но я хочу, чтобы клиент получил набор результатов SELECT ....)

Билли ОНил
источник

Ответы:

17

Каждый оператор SELECT, который не вставляется в таблицу или переменную, создает набор результатов.

Если вы хотите, чтобы ваша хранимая процедура возвращала только один набор результатов, убедитесь, что у вас есть только один оператор SELECT. Если у вас есть другие операторы SELECT, убедитесь, что они вставляют результаты в таблицу или переменную.

ОБНОВЛЕНИЕ
Вот примеры хранимых процедур.

Эта хранимая процедура будет возвращать один набор результатов:

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 ;

Эта хранимая процедура будет возвращать два набора результатов:

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
источник
Ах, так что, если он входит в таблицу или переменную, он не включается в результате? Как можно получить доступ к этому; используя, например, SELECT INTO?
Билли ОНил
Да, на первый вопрос. Мне не понятно ваш второй вопрос. Если я хочу , чтобы сохранить значение в локальную переменную внутри хранимой процедуры, я бегу что - то вроде этого: SELECT column_name LIMIT 1 INTO local_variable_name;.
dabest1
Пример запроса выше должно быть: SELECT column_name FROM table LIMIT 1 INTO local_variable_name;.
dabest1
если я хочу , чтобы получить переменную после stored_procedure_name вызова из другой хранимой процедуры, я не могу установить результат = stored_procedure_name вызова () ;, как ее решить , если я использую курсор, DECLARE CURSOR FOR c_dept get_info_user_visitstatistics вызова () ошибка синтаксиса?
Амитабха