【问题标题】:Unable to Create Prepared Statements in MySQL无法在 MySQL 中创建准备好的语句
【发布时间】:2011-08-27 04:48:59
【问题描述】:

我正在尝试在 MySQL 中创建一个接受单个参数的准备好的语句。当我在命令行上尝试这个时,我得到一个语法错误。但是,当我准备好的语句中没有变量时,我可以很好地创建它们。下面是我在 MySQL 命令提示符下看到的内容的复制和粘贴:

mysql> PREPARE state_name FROM "select * from ? limit 1";

ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 '? 附近使用的正确语法。在第 1 行限制 1'

mysql> PREPARE state_name FROM "select * from documents limit 1";
查询正常,0 行受影响(0.00 秒) 准备好的声明

我使用的 MySQL 版本是 5.0.77-log。

是否有我没有看到的语法错误?为了让准备好的语句起作用,我必须设置任何配置参数吗?

【问题讨论】:

    标签: mysql prepared-statement


    【解决方案1】:

    恐怕您不能将表名作为准备好的语句参数传递,也不能将列传递给分组或排序依据。您唯一可以参数化的是 where 子句或更新中的字段:

    PREPARE state_name FROM "select * from documents where id = ?";
    
    PREPARE state_name FROM "update documents set field = ? where id = ?";
    

    【讨论】:

      【解决方案2】:

      如果你想创建一个单独的准备语句并将其用于多个表,你实际上可以为每个表创建一个变量,然后使用这个变量创建语句,正如 MySQL manual 解释的那样:

      mysql> USE test;
      mysql> CREATE TABLE t1 (a INT NOT NULL);
      mysql> INSERT INTO t1 VALUES (4), (8), (11), (32), (80);
      
      mysql> SET @table = 't1';
      mysql> SET @s = CONCAT('SELECT * FROM ', @table);
      
      mysql> PREPARE stmt3 FROM @s;
      mysql> EXECUTE stmt3;
      +----+
      | a  |
      +----+
      |  4 |
      |  8 |
      | 11 |
      | 32 |
      | 80 |
      +----+
      
      mysql> DEALLOCATE PREPARE stmt3;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-16
        • 2012-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多