динамический запрос 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;