在mysql存储过程中拼接sql解决in的字段类型不匹配问题

一个朋友问我一个问题,他写了一个存储过程,并在存储过程调用了另外一个自定义的函数。该函数返回类型如'1,34,56'的字符串,并将该字符串作为存储过程的select的id条件。

begin
    DECLARE my_id integer(10);
    set @var = func_name();
    // var = '1,456';
    select id into @my_id from student where id in(@var);
    return @my_id;
end;

select语句in里的是函数返回的带引号的字符串,而系统表里id字段是整形,所以需要拨去单引号。

方法有三:

1. 直接把函数返回作为子查询,

select id into @my_id from student where id in(select * from func_name);

2. 在存储过程拼接sql

BEGIN
    #Routine body goes here...
set @var = func_name();
set @sql = CONCAT('select id,name from student where id in(',@var,')');

PREPARE stmt from @sql;
EXECUTE stmt;

END

3. 拆分存储过程

将存储过程拆分,在前端java里分开执行,第一步执行函数,拿到结果在java里拼接不带引号的sql in语句即可。

ok!

posted @ 2017-06-01 21:19  love/coder  阅读(3633)  评论(0编辑  收藏  举报