Beispiel für eine gespeicherte MySQL-Prozedurmethode zum Zurückgeben mehrerer Werte

Beispiel für eine gespeicherte MySQL-Prozedurmethode zum Zurückgeben mehrerer Werte

Dieser Artikel beschreibt anhand eines Beispiels, wie in einer gespeicherten MySQL-Prozedur mehrere Werte zurückgegeben werden. Teilen Sie uns die Einzelheiten zu Ihrer Information mit:

Gespeicherte MySQL-Funktionen geben nur einen Wert zurück. Um eine gespeicherte Prozedur zu entwickeln, die mehrere Werte zurückgibt, müssen Sie eine gespeicherte Prozedur mit INOUT- oder OUT-Parametern verwenden. Schauen wir uns zunächst die Struktur einer Auftragstabelle an:

mysql> desc-Bestellungen;
+----------------+-------------+------+-----+---------+---------+----------+
| Feld | Typ | Null | Schlüssel | Standard | Extra |
+----------------+-------------+------+-----+---------+---------+----------+
| Bestellnummer | int(11) | NEIN | PRI | NULL | |
| Bestelldatum | Datum | NEIN | | NULL | |
| erforderlichesDatum | Datum | NEIN | | NULL | |
| Versanddatum | Datum | JA | | NULL | |
| Status | varchar(15) | NEIN | | NULL | |
| Kommentare | Text | JA | | NULL | |
| Kundennummer | int(11) | NO | MUL | NULL | |
+----------------+-------------+------+-----+---------+---------+----------+
7 Reihen im Set

Als Nächstes sehen wir uns eine gespeicherte Prozedur an, die eine Kundennummer akzeptiert und die Gesamtzahl der versandten, stornierten, gelösten und angefochtenen Bestellungen zurückgibt:

TRENNUNGSZEICHEN $$
PROZEDUR ERSTELLEN get_order_by_cust(
 IN Kundennummer INT,
 OUT versendet INT,
 OUT abgebrochen INT,
 OUT aufgelöst INT,
 OUT umstritten INT)
BEGINNEN
 -- versendet
 WÄHLEN
      Anzahl(*) INTO versendet
    AUS
      Bestellungen
    WO
      Kundennummer = Kundennr.
        UND Status = „Versendet“;
 -- abgesagt
 WÄHLEN
      count(*) INTO abgebrochen
    AUS
      Bestellungen
    WO
      Kundennummer = Kundennr.
        UND Status = ‚Abgebrochen‘;
 -- gelöst
 WÄHLEN
      count(*) INTO aufgelöst
    AUS
      Bestellungen
    WO
      Kundennummer = Kundennr.
        UND Status = ‚Gelöst‘;
 -- umstritten
 WÄHLEN
      count(*) INTO umstritten
    AUS
      Bestellungen
    WO
      Kundennummer = Kundennr.
        UND-Status = ‚Umstritten‘;
ENDE

Tatsächlich erfordert die gespeicherte Prozedur zusätzlich zu den IN-Parametern auch vier weitere OUT-Parameter: versendet, storniert, gelöst und umstritten. Verwenden Sie in der gespeicherten Prozedur eine Select-Anweisung mit der Count-Funktion, um die entsprechende Gesamtzahl der Bestellungen basierend auf dem Bestellstatus abzurufen und sie dem entsprechenden Parameter zuzuweisen. Wenn wir gemäß dem obigen SQL die gespeicherte Prozedur get_order_by_cust verwenden möchten, können wir die Kundennummer und vier benutzerdefinierte Variablen übergeben, um den Ausgabewert zu erhalten. Nach der Ausführung der gespeicherten Prozedur verwenden wir die SELECT-Anweisung, um den Variablenwert auszugeben:

+----------+--------------+-----------+--------------+
| @versendet | @storniert | @gelöst | @umstritten |
+----------+--------------+-----------+--------------+
| 22 | 0 | 1 | 1 |
+----------+--------------+-----------+--------------+
1 Reihe im Set

In Kombination mit praktischen Anwendungen werfen wir einen Blick auf den Aufruf einer gespeicherten Prozedur, die mehrere Werte aus einem PHP-Programm zurückgibt:

<?php
/**
 * Gespeicherte Prozedur aufrufen, die mehrere Werte zurückgibt
 * @param $Kundennummer
 */
Funktion call_sp($Kundennummer)
{
  versuchen {
    $pdo = neues PDO("mysql:host=localhost;dbname=yiibaidb", "root", "123456");
    // führe die gespeicherte Prozedur aus
    $sql = 'CALL get_order_by_cust(:nein,@versendet,@storniert,@gelöst,@umstritten)';
    : $stmt = $pdo->prepare($sql);
    $stmt->bindParam(':no', $customerNumber, PDO::PARAM_INT);
    $stmt->execute();
    $stmt->closeCursor();
    // führe die zweite Abfrage aus, um Werte vom OUT-Parameter abzurufen
    $r = $pdo->query("AUSWÄHLEN @versendet,@storniert,@gelöst,@umstritten")
         ->abrufen(PDO::FETCH_ASSOC);
    wenn ($r) {
      printf('Versendet: %d, Abgebrochen: %d, Gelöst: %d, Umstritten: %d',
        $r['@versendet'],
        $r['@abgebrochen'],
        $r['@gelöst'],
        $r['@umstritten']);
    }
  } Fang (PDOException $pe) {
    die("Ein Fehler ist aufgetreten:" . $pe->getMessage());
  }
}
ruf_sp(141);

Im obigen Code werden die benutzerdefinierten Variablen vor dem @-Symbol mit der Datenbankverbindung verknüpft, sodass sie zwischen den Aufrufen für den Zugriff verfügbar sind.

Okay, das ist alles zu diesem Teilen.

Leser, die an weiteren MySQL-bezogenen Inhalten interessiert sind, können sich die folgenden Themen auf dieser Site ansehen: „Kenntnisse zu gespeicherten MySQL-Prozeduren“, „Zusammenfassung der allgemeinen MySQL-Funktionen“, „Kenntnisse zu MySQL-Protokollvorgängen“, „Zusammenfassung der Kenntnisse zu MySQL-Transaktionsvorgängen“ und „Zusammenfassung der Kenntnisse zu MySQL-Datenbanksperren“.

Ich hoffe, dass dieser Artikel für jedermann beim Entwurf einer MySQL-Datenbank hilfreich ist.

Das könnte Sie auch interessieren:
  • Anweisungen zur Verwendung der MySQL CASE WHEN-Anweisung
  • Zusammenfassung der if- und case-Anweisungen in MySQL
  • Mehrere Beispiele für die Verwendung der CASE WHEN-Anweisung von MySQL
  • So verwenden Sie die Case-When-Anweisung in MySQL, um eine Abfrage mit mehreren Bedingungen zu implementieren
  • Detailliertes Beispiel für die Verwendung der if-Anweisung in einer gespeicherten MySQL-Prozedur
  • Detaillierte Erklärung des Prinzips und der Verwendung des Cursors (DECLARE) in der gespeicherten MySQL-Prozedur
  • Definition und Zuweisung von Variablen in gespeicherten MySQL-Prozeduren
  • Einführung in die Verwendung der Cursorschleife für gespeicherte Prozeduren in MySQL
  • Detaillierte Erläuterung der gespeicherten Prozeduren und Funktionen von MySql
  • Detailliertes Beispiel für die Verwendung der Case-Anweisung in einer gespeicherten MySQL-Prozedur

<<:  js implementiert eine Formularvalidierungsfunktion

>>:  Lösung für das Problem des Sitzungsverlusts bei Nginx

Artikel empfehlen

So bereinigen Sie den MySQL-Speicherplatz in der Alibaba Cloud

Heute habe ich von Alibaba Cloud eine Festplatten...

So drücken Sie relative Pfade in Linux aus

Wenn Ihr aktueller Pfad beispielsweise /var/log i...

Toolkit: Ein leistungsfähigeres Front-End-Framework als Bootstrap

Hinweis: Die derzeit beliebtesten Front-End-Frame...

Detaillierte Erklärung zur Verwendung des Linux-Befehls mpstat

1. mpstat-Befehl 1.1 Befehlsformat mpstat [ -A ] ...

Grundlegende Referenztypen der erweiterten JavaScript-Programmierung

Inhaltsverzeichnis 1. Datum 2. RegExp 3. Original...

So nutzen Sie die Multi-Core-CPU in node.js voll aus

Inhaltsverzeichnis Überblick So nutzen Sie die Mu...

So debuggen Sie das Loader-Plugin in einem Webpack-Projekt

Als ich kürzlich lernte, wie man webpack verwende...

Implementierung der Wiederaufnahme des K8S-Knotens in den Master-Cluster

1. Knoten löschen Führen Sie kubectl delete node ...

Detailliertes Beispiel für das Datenbankbetriebsobjektmodell in Spring jdbc

Detailliertes Beispiel für das Datenbankbetriebso...

Führen Sie die Schritte zur Verwendung des Elements in vue3.0 aus

Vorwort: Verwenden Sie das Element-Framework in v...

So verwalten Sie große Datei-Uploads und Breakpoint-Resumes basierend auf js

Inhaltsverzeichnis Vorwort Frontend-Struktur Back...

Tutorial zur Installation von htop unter CentOS 8

Wenn Sie Ihr System interaktiv überwachen möchten...