MySQL подготовить заявление - PullRequest
3 голосов
/ 20 июля 2011

У меня есть серия из 16 операторов PREPARE, EXECUTE и DEALLOCATE (в хранимой процедуре), каждая из которых вставляет строки в таблицу с различными данными (таблица 1 - таблица 16).Например:

SET @Command1 = CONCAT("insert into TABLE1" ,  ...etc.. );
PREPARE stmt1 FROM @Command1 ;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

SET @Command1 = CONCAT("insert into TABLE2" ,  ...etc.. );
PREPARE stmt1 FROM @Command1 ;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

.
.
.

SET @Command1 = CONCAT("insert into TABLE16" ,  ...etc.. );
PREPARE stmt1 FROM @Command1 ;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

Когда я выполняю хранимую процедуру, INSERT работает с перебоями.Иногда все 16 вставок работают, но иногда они не работают.

В последнем вызове хранимой процедуры, первые 2 вставки (в TABLE1 и TABLE2) и последние 4 вставки (TABLE 13-16)работать, но не вставки в Таблицу 3 - 12.

Можете ли вы объяснить, почему?Не может быть, потому что я использую ту же переменную / дескриптор command1 и stmt1?

1 Ответ

0 голосов
/ 22 апреля 2017

В MySQL сочетания команд Prepare и Execute должны использоваться с заполнителями - экономя ваше время с помощью строк конкатов (возможно, один из ваших конкатов просто работает неправильно) и, конечно, - предотвращает sql инъекции (да!)

Итак ... просто создайте свои утверждения, как этот:

-- in MySQL ? is a placeholder
set @sampleQuery = 'select name into @testValue from myTable where id = ?'; 
set @idParam = 'NT54X9';

prepare sampleStatement from @sampleQuery;
execute sampleStatement using @idParam; -- `using` is the key point here
deallocate prepare sampleStatement;

select @testValue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...