Heim > Datenbank > MySQL-Tutorial > Detaillierte Einführung in gespeicherte MySQL-Prozeduren (Codebeispiel)

Detaillierte Einführung in gespeicherte MySQL-Prozeduren (Codebeispiel)

不言
Freigeben: 2019-02-27 13:42:44
nach vorne
2936 Leute haben es durchsucht

Dieser Artikel bietet Ihnen eine detaillierte Einführung (Codebeispiel) über die gespeicherte MySQL-Prozedur. Ich hoffe, dass er für Freunde hilfreich ist.

1. Was ist eine gespeicherte Prozedur?

Eine Sammlung von einer oder mehreren MySQL-Anweisungen, die zur späteren Verwendung gespeichert werden.

Die Idee gespeicherter Prozeduren ist die Kapselung und Wiederverwendung von Code auf der SQL-Sprachebene der Datenbank.

(Verwandte Empfehlungen: MySQL-Tutorial)

2. Warum gespeicherte Prozeduren verwenden

  1. Kapseln Verarbeitung in benutzerfreundliche Einheiten zur Vereinfachung komplexer Vorgänge

  2. Verhindern Sie Fehler und stellen Sie die Datenkonsistenz sicher

  3. Vereinfachen Sie die Reaktion auf Änderungen und verwalten Sie sie. (Ändern Sie den entsprechenden Tabellennamen, Spaltennamen usw., um den Code der entsprechenden gespeicherten Prozedur zu ändern. Personen, die sie verwenden, müssen die Änderungen nicht kennen)

  4. Leistung verbessern

  5. Flexibel

Im Allgemeinen einfach, sicher und leistungsstark
Nachteile:

  1. Es ist komplizierter zu schreiben als SQL-Anweisungen

  2. Berechtigungsprobleme (möglicherweise keine Berechtigung, im Allgemeinen gespeicherte Prozeduren verwenden, keine Berechtigung zum Erstellen gespeicherter Prozeduren)

3. Gespeicherte Prozeduren erstellen

CREATE  PROCEDURE productpricing()
BEGIN
SELECT Avg(prod_price) AS priceaverage
FROM products;
END
Nach dem Login kopieren

Hinweis: Probleme bei der Eingabe in die Befehlszeile

mysql> delimiter //
mysql> CREATE PROCEDURE productpricing()
    -> BEGIN
    -> SELECT Avg(prod_price) AS priceaverage
    -> FROM products;
    -> END //
Nach dem Login kopieren

4. Gespeicherte Prozeduren verwenden

Eine gespeicherte Prozedur ist eigentlich eine Funktion

CALL productpricing();
Nach dem Login kopieren

4. Löschen Sie die gespeicherte Prozedur

    drop procedure productpricing;
    drop procedure if EXISTS productpricing;
Nach dem Login kopieren

5. Verwenden Sie Parameter

Im Allgemeinen zeigt die gespeicherte Prozedur die Ergebnisse nicht an, aber gibt die Ergebnisse an die von Ihnen angegebene Variable zurück
Variable (Variable) Ein bestimmter Speicherort im Speicher, der zum vorübergehenden Speichern von Daten verwendet wird.

CREATE PROCEDURE productpricing(
    OUT p1 DECIMAL(8,2),
    OUT ph DECIMAL(8,2),
    OUT pa DECIMAL(8,2)
)
BEGIN
SELECT MIN(prod_price)
INTO p1
FROM products;
SELECT MAX(prod_price)
INTO ph
FROM products;
SELECT avg(prod_price)
INTO pa
FROM products;
END;
Nach dem Login kopieren

Das Schlüsselwort OUT gibt an, dass der entsprechende Parameter verwendet wird, um einen Wert aus der gespeicherten Prozedur zu übergeben (Rückgabe an den Aufrufer).
MySQL unterstützt Parameter vom Typ IN (an gespeicherte Prozeduren übergeben),
OUT (von gespeicherten Prozeduren übergeben, wie hier verwendet) und
INOUT (an gespeicherte Prozeduren übergeben und von gespeicherten Prozeduren übergeben).

Variablenname Alle MySQL-Variablen müssen mit @ beginnen.
Gespeicherte Prozedur aufrufen

call productpricing(@pricelow,@pricehign,@priceaverage);
Nach dem Login kopieren

Abfrage

SELECT @priceaverage;
Nach dem Login kopieren
SELECT @priceaverage,@pricehign,@pricelow;
Nach dem Login kopieren

Erstellen mit in und out

CREATE PROCEDURE ordertotal(
    IN onumber INT,
    OUT ototal DECIMAL(8,2)
)
BEGIN
SELECT sum(item_price*quantity)
FROM orderitems
WHERE order_num = onumber
INTO ototal;
END;
Nach dem Login kopieren

ruft

call ordertotal(20005,@total);
Nach dem Login kopieren

auf, um

select @total;
Nach dem Login kopieren

abzufragen. 6. Erstellen Sie intelligente gespeicherte Prozeduren

Alle bisher verwendeten gespeicherten Prozeduren kapseln grundsätzlich die einfache SELECT-Anweisung von MySQL. Obwohl sie alle gültige Beispiele für gespeicherte Prozeduren sind, können sie das tun, was Sie direkt mit diesen gekapselten Anweisungen tun können (wenn sie noch mehr bringen können, dann ist es, die Dinge komplizierter zu machen). Die Leistungsfähigkeit gespeicherter Prozeduren wird erst dann wirklich deutlich, wenn sie Geschäftsregeln und intelligente Verarbeitung beinhalten.

   考虑这个场景。你需要获得与以前一样的订单合计,但需要对合计增加营业税,不过只针对某些顾客(或许是你所在州中那些顾客)。那么,你需要做下面几件事情:
   1、获得合计(和以前一样)
   2、把营业税有条件的添加到合计
   3、返回合计(带或不带税的)
Nach dem Login kopieren

Wir geben den folgenden Code ein:

-- Name: ordertotal        //   添加注释
-- Parameters: onumber = order number
--             taxable = 0 if not taxable, 1 if taxtable
--             ototal = order total variable

CREATE     PROCEDURE ordertotal (
IN onumber INT,
IN taxable BOOLEAN,
OUT ototal DECIMAL(8,2)
) COMMENT 'Obtain order total, optionally adding tax'
BEGIN
    
        -- Declare variable for total
        DECLARE total DECIMAL(8,2);     //   声明变量   
        -- Declare tax percentage
        DECLARE taxrate INT DEFAULT 6;
        
        -- Get the order total
        SELECT Sum(item_price*quantity)
        FROM orderitems
        WHERE order_num = onumber
        INTO total;
        
        -- Is this taxable?
        IF taxable THEN
            -- yes,so add taxrate to the total
            SELECT total+(total/100*taxrate) INTO total;
        END IF;
        --  And finally, save to out variable
        SELECT total INTO ototal;
END;
Nach dem Login kopieren
此存储过程有很大的变动。首先,增加了注释(前面放置 --)。在存储过程复杂性增加时,这样做特别重要。  
添加了另外一个参数 taxable,它是一个布尔值(如果要增加税则为真,否则为假)。  
在存储过程体中,用 DECLARE语句定义了两个局部变量。 DECLARE要求指定变量名和数据类型,
它也支持可选的默认值(这个例子中的 taxrate的默认被设置为 6%)。SELECT 语句变,因此其结果存储到 total(局部变量)而不是 ototal。  
IF 语句检查taxable是否为真,如果为真,则用另一SELECT语句增加营业税到局部变量 total。

最后,用另一SELECT语句将total(它增加或许不增加营业税)保存到 ototal。  
注意:COMMENT关键字 ,本例子中的存储过程在 CREATE PROCEDURE语句中包含了一个 COMMENT值。  
它不是必需的,但如果给出,将在SHOW PROCEDURE STATUS的结果中显示。

这显然是一个更高级,功能更强的存储过程。为试验它,请用以下两条语句:  
第一条:
Nach dem Login kopieren
call ordertotal(20005, 0, @total);
SELECT @total;
Nach dem Login kopieren
输出:
Nach dem Login kopieren
Nach dem Login kopieren
+--------+
| @total |
+--------+
|  38.47 |
+--------+
Nach dem Login kopieren
第二条:
Nach dem Login kopieren
call ordertotal(20009, 1,@total);
SELECT @total;
Nach dem Login kopieren
输出:
Nach dem Login kopieren
Nach dem Login kopieren
+--------+
| @total |
+--------+
|  36.21 |
+--------+
Nach dem Login kopieren
BOOLEAN值指定为1 表示真,指定为 0表示假(实际上,非零值都考虑为真,只有 0被视为假)。通过给中间的参数指定 0或1 ,可以有条件地将营业税加到订单合计上。
Nach dem Login kopieren

Dieses Beispiel zeigt die grundlegende Verwendung der IF-Anweisung von MySQL. Die IF-Anweisung unterstützt auch ELSEIF- und ELSE-Klauseln (erstere verwendet auch die THEN-Klausel, letztere nicht). Wir werden in zukünftigen Kapiteln weitere Verwendungsmöglichkeiten von IF (und anderen Flusskontrollanweisungen) sehen.

7. Überprüfen Sie die gespeicherte Prozedur

Um die CREATE-Anweisung anzuzeigen, die zum Erstellen einer gespeicherten Prozedur verwendet wird

show create PROCEDURE ordertotal;
Nach dem Login kopieren

Um detaillierte Informationen über die gespeicherte Prozedur zu erhalten, einschließlich wann und von wem sie ausgeführt wurde wurde erstellt. Es gibt viele Listen

show procedure status;
Nach dem Login kopieren

, verwenden Sie „Gefällt mir“, um

show procedure status like 'ordertotal';
Nach dem Login kopieren

zu filtern

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in gespeicherte MySQL-Prozeduren (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage