2016-07-26 14 views
-1

Ich habe eine gespeicherte MySQL-Prozedur, die drei Parameter verwendet.Partielle Vorbereitung der gespeicherten Prozedur

$stmt=$db->prepare("CALL MyStoredProce(?,?,?)"); 
$stmt->bind_param('iss',$id,$category,$name); 

In einem Fall ändern sich nur zwei Parameter. Kann ich Teil Vorbereitung wie (wo mittlere Parameter wird in dieser Zubereitung konstant sein):

$stmt=$db->prepare("CALL MyStoredProc(?,'CARS',?)"); 
$stmt->bind_param('is',$id,$name); 

Vielleicht könnte es einige Vorteile werden für DBMS mit weniger erwarteten Variationen in den Parametern Aussagen vorzubereiten?

Antwort

1

Die Aktion prepare erstellt einen "Ausführungsplan", bei dem es sich um eine Schritt-für-Schritt-Reihe von Vorgängen handelt, die der Motor tatsächlich ausführt. Diese Notwendigkeit tritt nur einmal auf, egal wie oft die Anweisung anschließend ausgeführt wird.

(Die EXPLAIN Verb wird in quasi-lesbarer Form dieses Ausführungsplan ausdrucken. Es ist ganz interessant ...)

Da die SQL drei ? Platzhalter enthalten ist, sieht der Ausführungsplan, der drei Parameter muss immer dann geliefert werden, wenn die Anweisung ausgeführt wird.

"Bindung" ist der Prozess, mit dem Sie angeben, welche Werte mit den einzelnen erforderlichen Parametern verknüpft werden sollen. Dies geschieht jedes Mal, wenn die vorbereitete Anweisung ausgeführt wird. Es hat nichts mit der prepare Schritt zu tun.


Übrigens:   spielt es keine Rolle, dass die SQL-Abfrage in diesem Fall besteht aus einem Aufruf einer gespeicherten Prozedur. Was ich gesagt habe, gilt für jede SQL-Anweisung.

+0

OK, ich weiß, was Sie gesagt haben, erklären Plan ist allgemein, wie Abfragevorbereitung in der Datenbank funktioniert. Aber ich denke, dass es hier nicht irrelevant ist, dass in meiner Statement-Vorbereitung ein Aufruf zur Stored Procedure erfolgt, da ich in der Lage wäre, vorbereitete Anweisungen für Abfragen wie 'INSERT INTO-Dienste (ID, Kategorie, Name) VALUES (?, 'CARS') zu erstellen. ,?) 'oder ich liege falsch (ich muss nachsehen). – sbrbot

+0

Was ich * meinte, in meinem Kommentar in Klammern, ist das, was ich sagte, gilt auch für * alle * Abfrage. Mit anderen Worten, es würde exakt auf eine Abfrage angewendet, die aus "INSERT INTO ..." besteht, wie es bei einer Abfrage der Fall wäre, die aus "CALL ..." besteht. Dies ist ein ******************************************************************* Schritt, in dem der 'Abfrageoptimierer' eine SQL-Zeichenfolge ... "jede Zeichenfolge, jede Zeichenfolge" ... in einen Aktionsplan umwandelt Sie sind absolut richtig, dass Sie eine vorbereitete Aussage für alles-an-allen erstellen können. Ich nehme an, dass das, was ich eigentlich "klären" wollte, dass es keinerlei Auswirkungen auf: den gespeicherten Prozess hat. –

Verwandte Themen