2016-07-26 3 views
-1

У меня есть хранимая процедура MySQL, которая принимает три параметра.Частичная подготовка хранимой процедуры

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

В одном случае изменяются только два параметра. Могу ли я сделать частичную подготовку, как (где средний показатель будет постоянным в этом препарате):

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

Может быть, может быть какой-то выгода для СУБД подготовить заявления с менее ожидаемыми изменениями в параметрах?

ответ

1

Действие prepare создает «план выполнения», который представляет собой пошаговую последовательность операций, которые фактически выполняет двигатель. Эта необходимость может произойти только один раз, независимо от того, сколько раз будет выполняться оператор .

(Глагол EXPLAIN напечатает этот план выполнения в квази-читаемой форме. Это довольно интересно ...)

Поскольку SQL содержит три ? заполнителей, план выполнения предусматривает, что три параметра должен быть предоставлен в любое время, когда выполняется инструкция.

«Связывание» - это процесс, с помощью которого вы указываете, какие значения должны быть связаны с каждым из необходимых параметров, и это происходит каждый раз, когда выполняется подготовленный оператор . Он не имеет ничего общего с шагом prepare.


Кстати:   это не имеет никакого значения, что SQL-запрос в данном случае состоит из вызова хранимой процедуры. То, что я сказал, относится к любому оператору SQL.

+0

ОК, я знаю, что вы сказали о плане объяснения, как правило, работает подготовка запросов в базе данных. Но я думаю, что здесь не несущественно, что в моем заявлении подготовка вызова заключается в хранимой процедуре, потому что я мог бы создать подготовленный оператор для запроса, например, услуги INSERT INTO (id, category, name) VALUES (?, 'CARS' ,?) 'или я ошибаюсь (я должен проверить). – sbrbot

+0

Что я * подразумевал, * в моем комментарии в скобках, это то, что я сказал, в равной мере относится к * любому * запросу. Другими словами, он будет применяться точно так же, как и запрос, состоящий из «INSERT INTO ...», как и для запроса, состоящего из «CALL ...». Это шаг *** клиента ** - стороны *, на котором «оптимизатор запросов» превращает строку SQL ... »любую строку, каждую строку« ... в план действий ». Вы абсолютно правы, что можете «создать подготовленное заявление» для чего угодно. Я полагаю, что то, что я действительно хотел «прояснить (??)», заключается в том, что оно не имело бы никакого влияния на: * хранимую процедуру ». –