Использование подготовленного оператора в динамическом представлении
Вот мой код
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');