Wie gibt MySQL eine Ergebnismenge von einer gespeicherten Prozedur zurück?

16

Ich versuche, mich mit gespeicherten Prozeduren für die Verwendung in einer Webanwendung vertraut zu machen. Was auch immer die letzte Anweisung in einer gespeicherten MySQL-Prozedur ist, scheint das zu sein, was als Ergebnismenge dieser Prozedur behandelt wird. Leider scheint es in den MySQL-Dokumenten Verweise zu geben, die besagen, dass eine Prozedur mehrere Ergebnismengen zurückgeben kann. Wie wird dieses Verhalten ausgelöst? Wie kann ich dem MySQL-Server mitteilen, dass ich ausdrücklich nur eine Ergebnismenge zurückgeben möchte?

(Ich habe zum Beispiel eine Abfrage, die ein SELECT ausführt, und ein paar Einfügungen. Ich möchte Clients nicht über die Einfügungen informieren, aber ich möchte, dass dem Client die Ergebnismenge des SELECT übergeben wird ....)

Billy ONeal
quelle

Antworten:

17

Jede SELECT-Anweisung, die nicht in eine Tabelle oder Variable eingefügt wird, erzeugt eine Ergebnismenge.

Wenn Ihre gespeicherte Prozedur nur eine Ergebnismenge zurückgeben soll, stellen Sie sicher, dass Sie nur eine SELECT-Anweisung haben. Wenn Sie andere SELECT-Anweisungen haben, stellen Sie sicher, dass sie Ergebnisse in eine Tabelle oder Variable einfügen.

UPDATE
Hier sind Beispiele für gespeicherte Prozeduren.

Diese gespeicherte Prozedur würde eine Ergebnismenge zurückgeben:

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 ;

Diese gespeicherte Prozedur würde zwei Ergebnismengen zurückgeben:

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
quelle
Ah, also, wenn es in eine Tabelle oder Variable geht, wird es nicht als Ergebnis einbezogen? Wie greift man darauf zu? mit zB SELECT INTO?
Billy ONeal
Ja zur ersten Frage. Ihre zweite Frage ist mir nicht klar. Wenn ich einen Wert in eine lokale Variable innerhalb der gespeicherten Prozedur speichern möchten, betreibe ich etwas wie folgt aus : SELECT column_name LIMIT 1 INTO local_variable_name;.
dabest1
Beispielabfrage oben hätte sein müssen: SELECT column_name FROM table LIMIT 1 INTO local_variable_name;.
Sabest1
wenn ich nach einem Aufruf stored_procedure_name von einer anderen gespeicherten Prozedur bekommen Variable will, kann ich nicht gesetzt Ergebnis = Aufruf stored_procedure_name () ;, wie es zu lösen , wenn ich die Cursor verwenden, DECLARE c_dept CURSOR FOR Aufruf get_info_user_visitstatistics () Syntaxfehler?
Amitābha