Использование подготовленного оператора в динамическом представлении

Вот мой код

Drop procedure if exists test//
CREATE PROCEDURE test(IN woeid VARCHAR(15))
  BEGIN
   SET @w1 := woeid;
SET @sql = CONCAT('CREATE OR REPLACE VIEW temp 
                   AS
                   SELECT * 
                   FROM test_table gp
                   WHERE gp.name =', @w1);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END//
Delimiter ;

call test('ABCD');

Я получаю сообщение об ошибке с кодом ошибки: 1054. Неизвестный столбец "ABCD" в предложении "где"

Пожалуйста помоги.

1 ответ

Решение

Звучит так, как будто вы бесполезно используете представления, когда какой-то другой подход был бы более подходящим.

Однако причина, по которой он не работает, заключается в том, что вы не заключили в кавычки свой строковый литерал, поэтому результирующий SQL содержит WHERE gp.name = ABCD в то время как это по крайней мере должно быть WHERE gp.name = 'ABCD', Вы можете использовать MySQL QUOTE() для этой цели, но лучше параметризовать значение:

DELIMITER //
DROP PROCEDURE IF EXISTS test//
CREATE PROCEDURE test(IN woeid VARCHAR(15))
BEGIN
  SET @w1:=woeid, @sql:=CONCAT('
    CREATE OR REPLACE VIEW temp AS
      SELECT * 
      FROM   test_table
      WHERE  name = ?
  ');
  PREPARE stmt FROM @sql;
  EXECUTE stmt USING @w1;
  DEALLOCATE PREPARE stmt;
  SET @w1:=NULL, @sql:=NULL;
END//
DELIMITER ;

CALL test('ABCD');
Другие вопросы по тегам