MySQL存储过程:在select语句中使用IN参数执行预准备语句抛出"错误代码:1054未知列"

时间:2017-06-05 12:24:56

标签: mysql stored-procedures

我是MySQl存储过程的新手。我正在尝试使用单个IN参数创建一个简单的过程,并执行简单的prepare select语句。我在创建PREPARE时直接在select语句中使用IN参数,这会在执行prepare语句时为IN参数抛出Unknown列错误。

DELIMITER $$

DROP PROCEDURE IF EXISTS test_prep_stmt_two$$

CREATE PROCEDURE test_prep_stmt_two(IN user_id_in INT)
BEGIN
    #this line causing error
    PREPARE param_stmt FROM "select * from users u where u.user_id=user_id_in";

    EXECUTE param_stmt;

    DEALLOCATE PREPARE param_stmt;


END $$

DELIMITER ;

DELIMITER $$

当我调用CALL程序时测试test_prep_stmt_two(1);我低于错误。

Error Code: 1054
Unknown column 'user_id_in' in 'where clause'

但是如果我将IN param值设置为过程中的任何变量并在准备select语句中使用它,那么它的工作正常。以下程序运作正常。

DELIMITER $$

DROP PROCEDURE IF EXISTS test_prep_stmt_three$$

CREATE PROCEDURE test_prep_stmt_three(IN user_id_in INT)
BEGIN

    SET @user_id_in=user_id_in;

    #this works fine
    PREPARE set_stmt FROM "select * from users u where u.user_id=@user_id_in";

    EXECUTE set_stmt;

    DEALLOCATE PREPARE set_stmt;

END $$

DELIMITER ;

请有人解释一下为什么在准备select语句抛出错误时使用IN参数。

1 个答案:

答案 0 :(得分:3)

DELIMITER $$

DROP PROCEDURE IF EXISTS test_prep_stmt_two$$

CREATE PROCEDURE test_prep_stmt_two(IN user_id_in INT)
BEGIN

 SET @t1 =CONCAT("select * from users u where u.user_id= '",user_id_in,"'");
 PREPARE param_stmt FROM @t1;
 EXECUTE param_stmt;
 DEALLOCATE PREPARE param_stmt;


END $$

DELIMITER ;

DELIMITER $$

尝试以上代码。

希望这会有所帮助。