W jaki sposób MySQL zwraca zestaw wyników z procedury składowanej?

16

Staram się omijać procedury składowane do użycia w aplikacji internetowej. Wydaje mi się, że cokolwiek ostatnia instrukcja znajduje się w procedurze przechowywanej MySQL, wydaje się, że jest traktowane jako zestaw wyników tej procedury. Niestety wydaje się, że w dokumentach MySQL znajdują się odwołania, które mówią, że procedura może zwrócić wiele zestawów wyników. Jak wywoływane jest to zachowanie? Jak mogę powiedzieć serwerowi MySQL, że jawnie chcę zwrócić tylko jeden zestaw wyników?

(Na przykład mam zapytanie, które wykonuje SELECT i kilka wstawek. Nie chcę informować klientów o wstawkach, ale chcę, aby klient otrzymał zestaw wyników SELECT ....)

Billy ONeal
źródło

Odpowiedzi:

17

Każda instrukcja SELECT, która nie wstawia się do tabeli lub zmiennej, wygeneruje zestaw wyników.

Jeśli chcesz, aby procedura składowana zwróciła tylko jeden zestaw wyników, upewnij się, że masz tylko jedną instrukcję SELECT. Jeśli masz inne instrukcje SELECT, upewnij się, że wstawiają wyniki do tabeli lub zmiennej.

AKTUALIZACJA
Oto przykłady procedur przechowywanych.

Ta procedura składowana zwróciłaby jeden zestaw wyników:

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 ;

Ta procedura składowana zwróciłaby dwa zestawy wyników:

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
źródło
Ach, więc jeśli trafi do tabeli lub zmiennej, nie zostanie uwzględniony? Jak można to uzyskać; używając np. SELECT INTO?
Billy ONeal
Tak, na pierwsze pytanie. Nie mam jasności co do twojego drugiego pytania. Jeśli chcę, aby zapisać wartość do zmiennej lokalnej z wewnątrz procedury przechowywanej, biegnę coś takiego: SELECT column_name LIMIT 1 INTO local_variable_name;.
dabest1,
Zapytanie próbka powyżej powinno być: SELECT column_name FROM table LIMIT 1 INTO local_variable_name;.
dabest1
jeśli chcę uzyskać zmienną po wywołaniu nazwa_procedury_procedury z innej procedury składowanej, nie mogę ustawić wyniku = wywołanie nazwa_procedury_przechowywania () ;, jak ją rozwiązać? jeśli używam kursora, ZADEKLARUJ c_dept KURSOR DLA wywołania błąd get_info_user_visitstatistics () błąd
Amitābha