Як 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 ;

Так, якщо вона потрапляє в таблицю або змінну, вона не включається в результаті? Як отримати доступ до цього; використовуючи, наприклад, SELECT INTO?
Біллі ONeal

Так, для першого питання. Мені не зрозуміло у вашому другому запитанні. Якщо я хочу , щоб зберегти значення в локальну змінну всередині процедури, що, я біжу що - щось на зразок цього: SELECT column_name LIMIT 1 INTO local_variable_name;.
dabest1

Приклад запиту вище повинно бути: SELECT column_name FROM table LIMIT 1 INTO local_variable_name;.
dabest1

якщо я хочу отримати змінну після виклику storage_procedure_name з іншої збереженої процедури, я не можу встановити результат = виклик зберігати_процедуру_ім'я () ;, як її вирішити? якщо я використовую курсор, DECLARE c_dept CURSOR ДЛЯ виклику get_info_user_visitstatistics () синтаксична помилка
Amitābha
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.