2010-11-25 11 views
14

Ich habe gegoogled, aber mit nichts kommen, dass ich meinen Kopf herum bekommen kann.Anfängerleitfaden zu gespeicherten Prozeduren mit MySQL?

Sind die Leistungssteigerungen bei der Verwendung gespeicherter Prozeduren signifikant?

Würde ich immer noch vorbereitete Anweisungen in Verbindung mit gespeicherten Procs verwenden wollen oder ist es im Allgemeinen eine oder die andere Sache?

Kann ich gespeicherte Prozeduren über PHPMyAdmin erstellen und von dort aus verwalten?

Was würde eine gespeicherte Prozedur aussehen wie für etwas Einfaches wie this-

SELECT * FROM table a 
INNER JOIN otherTable b 
ON a.join_id=b.join_id 
WHERE someVar = :boundParam 

und wie würden die PHP-Arbeit (PDO) zu nennen und seine Parameter binden?

+0

kein Wettbewerb - sprocs sind auf so vielen Ebenen effizienter. Vergessen wir die Abfrageoptimierung und die Ausführungsgeschwindigkeit - denken wir an die erforderlichen Aufrufe, an die gesendeten Bytes ..., an die erforderlichen Grants (exec vs. all), an die Sicherheit, an wie viele Aufrufe muss mysqli/pdo an exec 1 parametrisierte Abfrage vornehmen? wäre das 2 ??? lol –

Antwort

4

Introduction

„A gespeicherten Routine ist ein Satz von SQL-Anweisungen, die auf dem Server gespeichert werden können.“

A gespeicherten Prozedur ein Segment der deklarativen SQL-Anweisungen innerhalb gespeichert ist der Datenbankkatalog. Eine gespeicherte Prozedur kann durch Trigger, andere gespeicherte Prozeduren aufgerufen werden, und Anwendungen wie Java, Python, PHP usw.

Eine gespeicherte Prozedur ist ein Verfahren zu wiederholende Aufgaben kapseln. Sie ermöglichen Variablendeklarationen, Flusskontrolle und andere nützliche Programmiertechniken.

Pros

  • Teilen Logik mit anderen Anwendungen.
  • Gespeicherte Prozeduren kapseln Funktionalität ein; Dies stellt sicher, dass Datenzugriff und -manipulation zwischen verschiedenen Anwendungen kohärent sind.

  • Benutzer von Datentabellen isolieren. Dies gibt Ihnen die Möglichkeit, Zugriff auf die gespeicherten Prozeduren zu gewähren, die die Daten bearbeiten, jedoch nicht direkt in den Tabellen.

  • Stellen Sie einen Sicherheitsmechanismus bereit. Wenn Sie unter dem vorherigen Punkt nur auf die Daten zugreifen können, die die definierten gespeicherten Prozeduren verwenden, kann kein anderer Benutzer eine DELETE SQL-Anweisung ausführen und Ihre Daten löschen.

  • Zur Verbesserung der Leistung, da der Netzwerkverkehr reduziert wird. Mit einer gespeicherten Prozedur können mehrere Anrufe zu einem zusammengefasst werden.

Cons

  • erhöhte Last auf dem Datenbankserver - die meiste Arbeit auf der Serverseite durchgeführt wird, und weniger auf der Client-Seite.
  • Es gibt eine anständige Lernkurve. Sie müssen die Syntax von MySQL-Anweisungen lernen, um gespeicherte Prozeduren zu schreiben.
  • Sie wiederholen die Logik Ihrer Anwendung an zwei verschiedenen Stellen:
  • Ihr Server-Code und der Code für gespeicherte Prozeduren, wodurch die Wartung etwas schwieriger wird. Die Migration zu einem anderen Datenbankverwaltungssystem (DB2, SQL Server usw.) kann möglicherweise schwieriger sein.

Schritt 1 - ein Trennzeichen

Der Begrenzer Picking ist das Zeichen oder die Zeichenfolge, die Sie den MySQL-Client verwenden werden, zu sagen, dass Sie den Befehl eingegeben haben in einer SQL-Anweisung haben. Seit Ewigkeiten ist das Trennzeichen immer ein Semikolon. Das verursacht jedoch Probleme, da in einer gespeicherten Prozedur viele Anweisungen vorhanden sein können und jede mit einem Semikolon enden muss. Ich bin mit „//“

Schritt 2 - So arbeiten Sie mit einer gespeicherten Prozedur

Erstellen einer gespeicherten Prozedur

DELIMITER // 

CREATE PROCEDURE `p2`() 
LANGUAGE SQL 
DETERMINISTIC 
SQL SECURITY DEFINER 
COMMENT 'A procedure' 
BEGIN 
    SELECT 'Hello World !'; 
END// 

Der erste Teil der Anweisung erstellt die Prozedur. Die nächsten Klauseln definieren die optionalen Merkmale des Verfahrens. Dann haben Sie den Namen und schließlich den Körper oder Routine-Code.

Bei Namen gespeicherter Prozeduren wird zwischen Groß- und Kleinschreibung unterschieden, und Sie können keine Prozeduren mit demselben Namen erstellen. Innerhalb eines Prozedurhauptteils können Sie keine Datenbankbearbeitungsanweisungen einfügen.

Die vier Merkmale eines Verfahrens sind:

Sprache:

Für Portabilität Zwecke; Der Standardwert ist SQL.

deterministisch:

Verfährt man immer wieder die gleichen Ergebnisse bei gleichem Input. Dies ist für Replikations- und Protokollierungszwecke. Der Standardwert ist NICHT DETERMINISTISCH.

SQL Security:

Bei Anrufzeit, überprüfen Privilegien des Benutzers. INVOKER ist der Benutzer, der die Prozedur aufruft. DEFINER ist der Ersteller des Verfahrens. Der Standardwert ist DEFINER.

Kommentar:

Zu Dokumentationszwecken; Der Standardwert ist „“

Aufrufen einer gespeicherten Prozedur

eine Prozedur aufzurufen, müssen Sie nur das Wort ANRUF, gefolgt vom Namen des Verfahrens, und dann die Klammern eingeben müssen, einschließlich aller Parameter zwischen ihnen (Variablen oder Werte). Klammern sind Pflichtfelder.

CALL stored_procedure_name (param1, param2, ....) 

CALL procedure1(10 , 'string parameter' , @parameter_var); 

Ändern einer gespeicherten Prozedur

MySQL ALTER PROCEDURE-Anweisung stellt eine Routine zu ändern, erlaubt aber nur für die Fähigkeit, bestimmte Eigenschaften zu ändern. Wenn Sie den Hauptteil oder die Parameter ändern müssen, müssen Sie die Prozedur löschen und neu erstellen.

eine gespeicherte Prozedur löschen

DROP PROCEDURE IF EXISTS p2; 

Dies ist ein einfacher Befehl. Die IF EXISTS-Klausel verhindert einen Fehler, falls die Prozedur nicht existiert. 3

Step - Parameter

Lassen Sie uns untersuchen, wie Sie die Parameter innerhalb einer gespeicherten Prozedur definieren.

- CREATE PROCEDURE proc1(): Parameterliste ist leer - CREATE PROCEDURE proc1 (IN varname DATA-TYPE): Ein Eingabeparameter. Das Wort IN ist optional, da die Parameter standardmäßig IN (Eingabe) sind. - CREATE PROCEDURE proc1 (OUT varname DATA-TYPE) : Ein Ausgangsparameter. - CREATE PROCEDURE proc1 (INOUT varname DATA-TYPE) : Ein Parameter, der sowohl Eingang als auch Ausgang ist. Natürlich können Sie mehrere Parameter definieren, die mit verschiedenen Typen definiert sind.

IN Beispiel

DELIMITER // 

CREATE PROCEDURE `proc_IN` (IN var1 INT) 
BEGIN 
    SELECT var1 + 2 AS result; 
END// 

INOUT Beispiel

DELIMITER // 

CREATE PROCEDURE `proc_INOUT` (OUT var1 INT) 
BEGIN 
    SET var1 = var1 * 2; 
END // 

Schritt 4 - Variablen

Der folgende Schritt lernen Sie, wie Variablen und Speichern von Werten innerhalb definieren eine Prozedur. Sie müssen diese explizit am Anfang des BEGIN/END-Blocks zusammen mit ihren Datentypen deklarieren. Nachdem Sie eine Variable deklariert haben, können Sie sie überall verwenden, wo Sie eine Sitzungsvariable oder ein Literal oder einen Spaltennamen verwenden können.

eine Variable deklariert die folgende Syntax:

DECLARE- Varname DATA-TYPE DEFAULT Default; Lassen Sie uns ein paar Variablen deklarieren:

DECLARE a, b INT DEFAULT 5; 

DECLARE str VARCHAR(50); 

DECLARE today TIMESTAMP DEFAULT CURRENT_DATE; 

DECLARE v1, v2, v3 TINYINT; 

Arbeiten mit Variablen

Sobald die Variablen deklariert wurden, können Sie ordnen sie schätzt die SET oder SELECT Befehl:

Schritt 5 - Flusskontrollstrukturen

MySQL unterstützt die IF, CASE, ITERATE, LEAVE LOOP, WHILE and REPEAT Konstruiert für die Ablaufsteuerung innerhalb gespeicherter Programme. Wir werden die Verwendung von IF, CASE und WHILE genauer betrachten, da sie die am häufigsten verwendeten Anweisungen in Routinen sind.

IF-Anweisung Mit der IF Aussage können wir Aufgaben bewältigen, welche Bedingungen beinhaltet:

DELIMITER // 

CREATE PROCEDURE `proc_IF` (IN param1 INT) 
BEGIN 
    DECLARE variable1 INT; 
    SET variable1 = param1 + 1; 

    IF variable1 = 0 THEN 
     SELECT variable1; 
    END IF; 

    IF param1 = 0 THEN 
     SELECT 'Parameter value = 0'; 
    ELSE 
     SELECT 'Parameter value <> 0'; 
    END IF; 
END // 

CASE-Anweisung Die CASE Aussage eine andere Art und Weise ist es, Bedingungen zu überprüfen und den entsprechenden Pfad zu nehmen. Es ist eine hervorragende Möglichkeit, mehrere IF-Anweisungen zu ersetzen. Die Anweisung kann auf zwei verschiedene Arten geschrieben werden, was eine große Flexibilität für die Handhabung mehrerer Bedingungen bietet.

DELIMITER // 

CREATE PROCEDURE `proc_CASE` (IN param1 INT) 
BEGIN 
    DECLARE variable1 INT; 
    SET variable1 = param1 + 1; 

    CASE variable1 
     WHEN 0 THEN 
      INSERT INTO table1 VALUES (param1); 
     WHEN 1 THEN 
      INSERT INTO table1 VALUES (variable1); 
     ELSE 
      INSERT INTO table1 VALUES (99); 
    END CASE; 

END // 

ODER

DELIMITER // 

CREATE PROCEDURE `proc_CASE` (IN param1 INT) 
BEGIN 
    DECLARE variable1 INT; 
    SET variable1 = param1 + 1; 

    CASE 
     WHEN variable1 = 0 THEN 
      INSERT INTO table1 VALUES (param1); 
     WHEN variable1 = 1 THEN 
      INSERT INTO table1 VALUES (variable1); 
     ELSE 
      INSERT INTO table1 VALUES (99); 
    END CASE; 

END // 

WHILE Anweisung

Es gibt technisch drei Standardschleifen: WHILE loops, LOOP loops, and REPEAT loops. Sie haben auch die Möglichkeit, eine Schleife mit dem "Darth Vader" der Programmiertechniken zu erstellen: die GOTO statement. Lesen Sie in diesem Beispiel einer Schleife in Aktion:

DELIMITER // 

CREATE PROCEDURE `proc_WHILE` (IN param1 INT) 
BEGIN 
    DECLARE variable1, variable2 INT; 
    SET variable1 = 0; 

    WHILE variable1 < param1 DO 
     INSERT INTO table1 VALUES (param1); 
     SELECT COUNT(*) INTO variable2 FROM table1; 
     SET variable1 = variable1 + 1; 
    END WHILE; 
END // 

Schritt 6 - Cursoren

Cursor wird verwendet, um durch einen Satz von Zeilen durch eine Abfrage und verarbeiten jede Zeile zurückgegeben iterieren.

MySQL unterstützt Cursor in gespeicherten Prozeduren. Hier finden Sie eine Zusammenfassung der grundlegenden Syntax zum Erstellen und Verwenden eines Cursors.

- DECLARE cursor-name CURSOR FOR SELECT ...;/* Deklaration und den Cursor mit einer Anweisung SELECT */

  • DECLARE WEITER HANDLER FÜR NICHT GEFUNDEN/angeben, was zu tun bevölkern, wenn keine weiteren Datensätze/

OPEN cursor-name;/öffnen Cursor gefunden verwenden/

FETCH cursor-name INTO variable [, variable];/Assign Variablen mit den aktuellen Spaltenwerten/

CLOSE cursor-name;/Schließen Cursor nach Gebrauch/

In diesem Beispiel werde ich einige einfache Operationen mit einem Cursor durchführen:

DELIMITER // 

CREATE PROCEDURE `proc_CURSOR` (OUT param1 INT) 
BEGIN 
    DECLARE a, b, c INT; 
    DECLARE cur1 CURSOR FOR SELECT col1 FROM table1; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1; 
    OPEN cur1; 

    SET b = 0; 
    SET c = 0; 

    WHILE b = 0 DO 
     FETCH cur1 INTO a; 
     IF b = 0 THEN 
      SET c = c + a; 
    END IF; 
    END WHILE; 

    CLOSE cur1; 
    SET param1 = c; 

END // 

Cursor hat drei wichtige Eigenschaften, die Sie müssen vertraut sein mit, um unerwartete Ergebnisse zu vermeiden:

  • Asensitive: Sobald der Cursor geöffnet ist, werden die Änderungen in den Quellentabellen nicht mehr angezeigt. Tatsächlich garantiert MySQL nicht, dass der Cursor aktualisiert wird, sodass Sie sich nicht darauf verlassen können.

  • Schreibgeschützt: Cursor sind nicht aktualisierbar.

  • Nicht Scrollbare: Cursors nur in einer Richtung durchlaufen werden kann, vorwärts, und Sie können keine Datensätze überspringen von Abrufen

Hope this hilfreich

+0

Any news on Optional Parameter? – jamheadart

Verwandte Themen