我是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参数。
答案 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 $$
尝试以上代码。
希望这会有所帮助。