1

这是我的代码

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。'where'子句中的未知列'ABCD'

请帮忙。

4

1 回答 1

3

听起来好像您在不必要地使用视图,而其他一些方法会更合适。

但是,它不起作用的原因是您没有引用字符串文字,因此生成的 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');
于 2013-05-01T14:30:40.083 回答