динамический запрос mysql в хранимой процедуре
Я создаю динамический запрос в хранимой процедуре. моя хранимая процедура выглядит следующим образом:
CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40),IN w_team VARCHAR(40))
BEGIN
SET @t1 =CONCAT("SELECT * FROM ",tab_name," where team=",w_team);
PREPARE stmt3 FROM @t1;
EXECUTE stmt3;
DEALLOCATE PREPARE stmt3;
END
когда я пытаюсь запустить его со следующим вызовом:
call test1 ('Test','SPA');
Я получаю следующее сообщение об ошибке:
Код Ошибки: 1054. Неизвестный столбец " SPA " в "WHERE clause"
Я тестировал без условия where, и он работает нормально, но с условием where его не работает, я попытался использовать @ с именем переменной, но он все еще не действовать.
Спасибо за вашу помощь.
3 ответов
попробуйте так:
SET @t1 =CONCAT("SELECT * FROM ",tab_name," where team='",w_team,"'");
объяснение:
предыдущий динамический запрос будет выглядеть так:
SELECT * FROM Test where team=SPA
и мы изменили его на:
SELECT * FROM Test where team='SPA'
попробуйте это..
CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40),IN w_team VARCHAR(40))
BEGIN
SET @t1 =CONCAT("SELECT * FROM ",tab_name," where team='",w_team,"'");
PREPARE stmt3 FROM @t1;
EXECUTE stmt3;
DEALLOCATE PREPARE stmt3;
END
у вас отсутствуют кавычки вокруг переменной w_team..
вы должны напечатать оператор, который динамически строится, чтобы вы могли просто скопировать напечатанный оператор и попытаться легко найти такую проблему.
select @t1 напечатает состояние, которое строится динамически..
Код Ошибки: 1054. Неизвестный столбец " SPA " в "WHERE clause"
это происходит, когда вы не заключаете входную строку в кавычки, и SQL engine пытается определить ее как столбец в запрашиваемой таблице. Но оно не как его не могу найти.
но что происходит, когда он находит такие колонки?
Он извлекает результаты, когда находит некоторые совпадения в значениях столбцов.
Очевидно, что это не то, что ожидал.
как преодолеть это? Используйте подготовленные операторы с динамическими входными значениями.
вы можете использовать заполнители, как ?
в хранимых процедурах тоже на динамических входных значениях для использования с Prepared Statements
. Механизм будет обрабатывать escape-символы и другие строковые значения при назначении или сравнении в выражениях SQL.
вам просто нужно повторно назначить входные данные процедуры одной или нескольким переменным сеанса, как требуется.
пример процедуры:
CREATE PROCEDURE `test1`( IN tab_name VARCHAR(40), IN w_team VARCHAR(40) )
BEGIN
SET @t1 = CONCAT( 'SELECT * FROM ', tab_name, ' where team = ?' ); -- <-- placeholder
SET @w_team := w_team;
PREPARE stmt3 FROM @t1;
EXECUTE stmt3 USING @w_team; -- <-- input for placeholder
DEALLOCATE PREPARE stmt3;
END;