【问题标题】:Using Prepared statement in Dynamic view在动态视图中使用 Prepared 语句
【发布时间】:2013-05-01 14:24:04
【问题描述】:

这是我的代码

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”列未知

请帮忙。

【问题讨论】:

  • @eggyal 有什么选择??我需要用户定义 gp.name。
  • 当我使用动态视图时,我需要使用准备语句

标签: mysql view mysql-error-1054


【解决方案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');

【讨论】:

  • 我不能使用它,因为视图的选择不能包含变量或参数 ERROR 1351
  • 太棒了。有效。正如我所看到的,这是 QUOTES 的问题。你能解释一下是什么问题吗?
  • @user2098662:我的回答中已经解释过了......这没有意义吗?你不明白什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 2016-07-27
  • 2013-03-28
  • 1970-01-01
  • 2015-11-26
  • 2012-03-27
相关资源
最近更新 更多