оператор mysql ПОДГОТОВКА

У меня есть серия из 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?


person Paul Koh    schedule 20.07.2011    source источник
comment
Этой недостаточно информации. Опубликуйте сгенерированные операторы (вы можете записать их, вставив в другую таблицу) и посмотрите, генерировали ли они какие-либо предупреждения или ошибки при вызове хранимой процедуры. Кроме того, почему вы используете CONCAT, а не параметры (EXECUTE ... USING ...)?   -  person outis    schedule 20.07.2011
comment
В хранимой процедуре вы можете просто распечатать операторы, используя SELECT, например SELECT @Command1; нет необходимости в INSERT INTO другой таблице. Кстати, вставка в другую таблицу для отладки, почему вставка в таблицу не работает, может быть сложной;)   -  person wonk0    schedule 20.07.2011
comment
Есть ли на самом деле какая-то выгода от CONCATing строки, а не от преобразования ее в подготовленный оператор? Он обходит привязку параметров, и вы не используете его более одного раза...   -  person Naltharial    schedule 20.07.2011


Ответы (1)


В MySQL комбинации команд Prepare и Execute следует использовать с заполнителями — это сэкономит ваше время на строках concat (может быть, одно из ваших concat просто пойдет не так) и, конечно же, предотвратит внедрение 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
person ymz    schedule 22.04.2017