一個朋友問我一個問題,他寫了一個存儲過程,並在存儲過程調用了另外一個自定義的函數。該函數返回類型如'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!