Detaillierte Erläuterung der Prinzipien und der Verwendung von gespeicherten MySQL-Prozeduren

Detaillierte Erläuterung der Prinzipien und der Verwendung von gespeicherten MySQL-Prozeduren

Dieser Artikel erläutert anhand von Beispielen die Prinzipien und die Verwendung von gespeicherten MySQL-Prozeduren. Teilen Sie uns die Einzelheiten zu Ihrer Information mit:

Eine gespeicherte Prozedur enthält eine Reihe ausführbarer SQL-Anweisungen. Die gespeicherte Prozedur wird in MySQL gespeichert und kann durch Aufrufen ihres Namens ausgeführt werden.

Vorteile gespeicherter Prozeduren

#1. Wird verwendet, um von Programmen geschriebene SQL-Anweisungen zu ersetzen, um Programme von SQL zu entkoppeln

#2. Sie können die Geschäftslogik (oder Fehler) ändern, indem Sie die gespeicherte Prozedur direkt ändern, ohne den Server neu zu starten

#3. Schnelle Ausführungsgeschwindigkeit. Nachdem die gespeicherte Prozedur kompiliert wurde, ist sie schneller, als wenn sie einzeln ausgeführt wird.

#4. Reduzieren Sie die Netzwerkübertragung, insbesondere in Situationen mit hoher Parallelität. Das ist ein großer Vorteil. Die gespeicherte Prozedur läuft direkt auf dem Datenbankserver und der gesamte Datenzugriff erfolgt innerhalb des Servers. Es besteht keine Notwendigkeit, Daten an andere Terminals zu übertragen.

Nachteile gespeicherter Prozeduren

1. SQL selbst ist eine strukturierte Abfragesprache mit einigen Steuerelementen (Zuweisung, Schleifen, Ausnahmebehandlung usw.), aber es ist nicht OO und im Wesentlichen prozedural. Angesichts komplexer Geschäftslogik wird die prozedurale Verarbeitung sehr schwierig sein. Dies ist ein schwerwiegender Fehler, das heißt, es kann nur auf Unternehmen mit einfacher Logik angewendet werden.

2. Nicht einfach zu debuggen. Grundsätzlich gibt es keinen guten Debugger, und zum Debuggen wird häufig „print“ verwendet. Das Debuggen von gespeicherten Prozeduren mit Hunderten von Zeilen ist mit dieser Methode jedoch schlicht ein Albtraum. Nun, das ist nichts, C#/Java kann auch Albtraumcode schreiben.

3. Es gibt keine Möglichkeit, Cache anzuwenden. Zwar gibt es Methoden wie globale temporäre Tabellen zur Zwischenspeicherung, diese erhöhen jedoch auch die Belastung der Datenbank. Wenn die Cache-Parallelität eine wichtige Rolle spielt und häufig Sperren erforderlich sind, besteht Anlass zur Sorge hinsichtlich der Effizienz.

4. Anpassung an Datenbankschnitt (horizontaler oder vertikaler Schnitt) nicht möglich. Nachdem die Datenbank aufgeteilt wurde, weiß die gespeicherte Prozedur nicht, in welcher Datenbank die Daten gespeichert sind.

Gespeicherte Prozedur ohne Parameter

Trennzeichen //
Prozedur p1() erstellen
BEGINNEN
  Wählen Sie * aus Blog;
  INSERT in Blog (Name, Sub_Time) Werte ("xxx", jetzt ();
ENDE //
Trennzeichen ;

#Rufen Sie p1() in MySQL auf

#Rufen Sie cursor.callproc('p1') basierend auf pymysql in Python auf
drucken(cursor.fetchall())

Gespeicherte Prozeduren mit Parametern

Für gespeicherte Prozeduren können Sie Parameter erhalten, die in drei Kategorien unterteilt sind:

#in wird nur zur Übergabe von Parametern verwendet
#out wird nur für Rückgabewerte verwendet
#inout kann übergeben und als Rückgabewert verwendet werden

Gespeicherte Prozedur mit in

mysql> wähle * aus emp;
+----+----------+-----+--------+
| ID | Name | Alter | dep_id |
+----+----------+-----+--------+
| 1 | zhangsan | 18 | 1 |
| 2 | lisi | 19 | 1 |
| 3 | egon | 20 | 2 |
| 5 | Alex | 18 | 2 |
+----+----------+-----+--------+
4 Reihen im Satz (0,30 Sek.)
mysql> Trennzeichen //
mysql> Prozedur p2 erstellen (in n1 int, in n2 int)
  -> beginnen
  -> wähle * aus emp, wobei ID >n1 und ID <n2;
  -> Ende //
Abfrage OK, 0 Zeilen betroffen (0,28 Sek.)
mysql> Trennzeichen;
mysql> rufe p2(1,3) auf
  -> ;
+----+------+-----+--------+
| ID | Name | Alter | dep_id |
+----+------+-----+--------+
| 2 | lisi | 19 | 1 |
+----+------+-----+--------+
1 Zeile im Satz (0,07 Sek.)
Abfrage OK, 0 Zeilen betroffen (0,07 Sek.)

#Rufen Sie cursor.callproc('p2',(1,3)) basierend auf pymysql in Python auf
drucken(cursor.fetchall())

Ohne

mysql> Trennzeichen //
mysql> Prozedur p3 erstellen (in n1 int, out res int)
  -> beginnen
  -> wähle * aus emp, wo ID >n1;
  -> setze res=1;
  -> Ende //
Abfrage OK, 0 Zeilen betroffen (0,28 Sek.)
mysql> Trennzeichen;
mysql> setze @res=0;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
mysql> rufe p3(3,@res) auf;
+----+------+-----+--------+
| ID | Name | Alter | dep_id |
+----+------+-----+--------+
| 5 | Alex | 18 | 2 |
+----+------+-----+--------+
1 Zeile im Satz (0,00 Sek.)
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)
mysql> wähle @res;
+------+
| @res |
+------+
| 1 |
+------+
1 Zeile im Satz (0,00 Sek.)

#Rufen Sie cursor.callproc('p3',(3,0)) basierend auf pymysql in Python auf. #0 ist gleichbedeutend mit set @res=0
print(cursor.fetchall()) #Frage die Abfrageergebnisse von select cursor.execute('select @_p3_0,@_p3_1;') ab. #@p3_0 stellt den ersten Parameter dar, @p3_1 stellt den zweiten Parameter dar, d. h. den Rückgabewert print(cursor.fetchall())

Beispiel mit inout

Trennzeichen //
Prozedur p4 erstellen(
  Ein/Aus n1 int
)
BEGINNEN
  Wählen Sie * aus dem Blog, wo ID > n1;
  setze n1 = 1;
ENDE //
Trennzeichen ;
#Aufruf set @x=3 in mysql;
rufe p4(@x) auf;
wähle @x;
#Rufen Sie cursor.callproc('p4',(3,)) basierend auf pymysql in Python auf
print(cursor.fetchall()) #Fragen Sie die Abfrageergebnisse von select cursor.execute('select @_p4_0;') ab.
drucken(cursor.fetchall())

Transaktionen

#Einführungstrennzeichen //
      Prozedur p4 erstellen(
        Ausgangsstatus int
      )
      BEGINNEN
        1. Deklarieren Sie, dass bei Auftreten einer Ausnahme { ausgeführt wird.
          Status = 1 setzen;
          zurückrollen;
        }
        Transaktion starten -- 100 von Qin Bings Konto abziehen
          -- 90 zu Fang Shaoweis Konto hinzufügen
          -- Zhang Gens Konto plus 10
          begehen;
        Endset-Status = 2;
      ENDE //
      Trennzeichen ;
#Trennzeichen implementieren //
Erstellen Sie das Verfahren p5 (
  AUS p_return_code tinyint
)
BEGINNEN 
  DECLARE-Exit-Handler für SQLexception 
  BEGINNEN 
    -- FEHLER 
    setze p_return_code = 1; 
    zurückrollen; 
  ENDE; 
  DECLARE-Exit-Handler für SQLwarning 
  BEGINNEN 
    --WARNUNG 
    setze p_return_code = 2; 
    zurückrollen; 
  ENDE; 
  TRANSAKTION STARTEN; 
    LÖSCHEN aus tb1; #Ausführung fehlgeschlagen, Einfügen in Blog (Name, Sub_Time) Werte ('yyy', jetzt ());
  BEGEHEN; 
  --ERFOLG 
  setze p_return_code = 0; #0 steht für erfolgreiche Ausführung END //
Trennzeichen ;

#Rufen Sie die gespeicherte Prozedur in MySQL auf. Set @res=123;
rufe p5(@res) auf;
wähle @res;

#Aufrufen gespeicherter Prozeduren basierend auf pymysql in Python cursor.callproc('p5',(123,))
print(cursor.fetchall()) #Fragen Sie die Abfrageergebnisse von select cursor.execute('select @_p5_0;') ab.
drucken(cursor.fetchall())

Ausführung gespeicherter Prozeduren

In MySQL ausführen

-- proc_name() ohne Parameter aufrufen
-- Mit Parametern, alles in
rufe proc_name(1,2) auf
- Es gibt Parameter, in, out, inout
setze @t1=0;
setze @t2=3;
rufe proc_name(1,2,@t1,@t2) auf

In pymsql ausführen

#!/usr/bin/env python
# -*- Kodierung:utf-8 -*-
pymysql importieren
conn = pymysql.connect(Host='127.0.0.1', Port=3306, Benutzer='root', Passwort='123', Datenbank='t1')
Cursor = Verbindung.Cursor(Cursor=pymysql.cursors.DictCursor)
# Führen Sie die gespeicherte Prozedur cursor.callproc('p1', args=(1, 22, 3, 4)) aus.
# Nach der Ausführung und Speicherung die Parameter abrufen cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")
Ergebnis = Cursor.fetchall()
conn.commit()
cursor.schließen()
conn.close()
drucken(Ergebnis)

Löschen einer gespeicherten Prozedur

Prozedur proc_name löschen;

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:
  • Zusammenfassung der if- und case-Anweisungen in MySQL
  • Detaillierte Erklärung des Prinzips und der Verwendung des Cursors (DECLARE) in der gespeicherten MySQL-Prozedur
  • Beispiel für eine gespeicherte MySQL-Prozedurmethode zum Zurückgeben mehrerer Werte
  • So erstellen (CREATE PROCEDURE) und rufen (CALL) Sie eine gespeicherte MySQL-Prozedur auf und so erstellen (DECLARE) und weisen (SET) Sie eine Variable zu
  • Beispielanalyse von gespeicherten MySQL-Prozeduren, die Fehlerbedingungen in gespeicherten Prozeduren auslösen (SIGNAL- und RESIGNAL-Anweisungen)
  • Detaillierte Erläuterung von Beispielen zur Fehlerbehandlung in gespeicherten MySQL-Prozeduren
  • Definition und Zuweisung von Variablen in gespeicherten MySQL-Prozeduren
  • Einführung in die Verwendung der Cursorschleife für gespeicherte Prozeduren in MySQL
  • Beispiel für eine gespeicherte MySQL-Prozedur (einschließlich Transaktionen, Ausgabeparameter, verschachtelte Aufrufe)
  • Detaillierte Erläuterung der gespeicherten Prozeduren und Funktionen von MySql
  • Detailliertes Beispiel für die Verwendung der if-Anweisung in einer gespeicherten MySQL-Prozedur

<<:  Detailliertes grafisches Tutorial zum Herunterladen und Installieren der VirtualBox-Software sowie zum Installieren und Bereitstellen in einer Linux-Umgebung

>>:  Vue-Routing - Methode zum Sprung relativer Pfade

Artikel empfehlen

Manjaro-Installation CUDA-Implementierungs-Tutorial-Analyse

Ende letzten Jahres habe ich im Dualsystem meines...

Erläuterung der CSS3-Überlaufeigenschaft

1. Überlauf Überlauf ist Überlauf (Container). We...

So ändern Sie die Längenbeschränkung von group_concat in MySQL

In MySQL gibt es eine Funktion namens „group_conc...

Implementierung von Check Constraints in MySQL 8.0

Hallo zusammen, ich bin Tony, ein Lehrer, der nur...

Unsere Gedanken zur Karriere als UI-Ingenieur

Ich bin seit langer Zeit depressiv, warum? Vor ein...

Lösen Sie das Spleißproblem beim Löschen von Bedingungen in myBatis

Ich habe heute gerade Mybatis gelernt und einige ...

Detaillierte Erläuterung der Persistenz des Vue-Seitenstatus

Inhaltsverzeichnis Code: Auffüllen: Zusammenfasse...

JS implementiert den Beispielcode der Dezimalkonvertierung in Hexadezimal

Vorwort Beim Schreiben von Code stoßen wir gelege...

Wie kann MySQL das Löschen und Weglaufen von Datenbanken wirksam verhindern?

Inhaltsverzeichnis Einstellungen für den abgesich...

Top 10 der nützlichsten und wichtigsten Open-Source-Tools im Jahr 2019

In der Open-Source-Umfrage von Black Duck aus dem...