【问题标题】:generic Mysql stored procedure通用Mysql存储过程
【发布时间】:2010-04-04 17:58:03
【问题描述】:

我有闲置的存储过程:

CREATE PROCEDURE `get`(IN tb VARCHAR(50), IN id INTEGER)
BEGIN
    SELECT * FROM tb  WHERE Indx = id;
END//

当我调用 get(user,1) 时,我得到以下信息:

ERROR 1054 (42S22): Unknown column 'user' in 'field list'

【问题讨论】:

  • 那是行不通的。如果要使用动态表名,则需要使用准备好的语句。但是我认为在这种情况下,首先要有一个存储过程是没有意义的。

标签: mysql sql mysql-error-1054


【解决方案1】:

您不能在 SQL 中使用变量作为表名,因为它会在编译过程时编译该变量。尝试使用准备好的语句:

CREATE PROCEDURE `get`(IN tb VARCHAR(50), IN id INTEGER)
BEGIN
    PREPARE stmt1 FROM CONCAT('SELECT * FROM ', tb, ' WHERE Indx = id');
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;
END//

但是请注意,这会变慢。

【讨论】:

  • SQL注入呢?安全吗?我没有看到任何针对它的安全措施,“tb”可以是任何东西,例如子查询。
【解决方案2】:

你可以叫它get('user',1)吗?

IN tb VARCHAR(50) 使其期望一个“字符串”,您传递的东西被 SQL 解析器解释为字段 user,而这并不知道。

【讨论】:

    猜你喜欢
    • 2016-10-19
    • 1970-01-01
    • 2019-10-28
    • 2018-08-22
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    相关资源
    最近更新 更多