我有一个程序,我将查询作为字符串,然后准备查询并执行。
这是程序
CREATE DEFINER=`root`@`%` PROCEDURE `dim_add_customer`(
IN _customer_id BIGINT(20) ,
IN _first_name VARCHAR(50) ,
)
BEGIN
SET @_query := CONCAT('first_name = "',_first_name,'"');
SET @_query := CONCAT('UPDATE customer_detail SET ',@_query,' WHERE customer_id = ',_customer_id);
PREPARE stmt FROM @_query;
END$$
DELIMITER ;
现在我打电话
call dim_add_customer(1,'abc\\')
然后在创建字符串查询时出现问题。它所做的查询
UPDATE customer_detail SET first_name = "abc\" WHERE customer_id = 1
有没有最好的解决方案来解决这个问题?
答案 0 :(得分:1)
您不应该通过concat构建查询。
您应该使用查询中的参数,如
SET @_query="UPDATE customer_detail
SET first_name=@_first_name
WHERE customer_id = @_customer_id"
我不确定你是否可以直接从输入参数声明你的变量,比如
CREATE DEFINER=`root`@`%` PROCEDURE `dim_add_customer`(
IN @_customer_id BIGINT(20) ,
IN @_first_name VARCHAR(50) ,
)
或者你必须
SET @_customer_id = _customer_id
SET @_first_name = _first_name
CAVEAT:我习惯于用MsSql方式创建带变量的程序;我可能误解了一些东西,但至少用concat创建sql应该是你最后的选择。
通过concat创建查询等同于
x=1
q=concat("y=",x,"+2")
eval (q)
而不是
x=1
y=x+2