一个动态SQL语句,如果要把执行的一些结果保存到变量中,可以用select into 的方法,但不能是本地变量,必须是session级的。
目录导航
使用本地变量报错
ERROR 1327 (42000): Undeclared variable: num
drop procedure if exists get_gc_task2;
delimiter //
create procedure get_gc_task2(in strlen int,in top int)
begin
declare num int;
set @executeSQL_sql='select count(*) into num from t1';
select @executeSQL_sql;
PREPARE executeSQL_s1 FROM @executeSQL_sql ;
EXECUTE executeSQL_s1;
DEALLOCATE PREPARE executeSQL_s1;
select strlen,top,now(),num from dual;
end//
delimiter ;
call get_gc_task2(1,2);
执行结果
使用sesssion变量成功
session变量用@开头,只要当前session都可以使用,所以也要注意不要和其它地方使用的发生命名重复,导致结果错误。建议用包含过程名字的变量,比如@get_gc_task2_AAA。
drop procedure if exists get_gc_task2;
delimiter //
create procedure get_gc_task2(in strlen int,in top int)
begin
declare num int;
set @executeSQL_sql='select count(*) into @get_gc_task2_AAAfrom t1';
select @executeSQL_sql;
PREPARE executeSQL_s1 FROM @executeSQL_sql ;
EXECUTE executeSQL_s1;
DEALLOCATE PREPARE executeSQL_s1;
set num=@get_gc_task2_AAA;
select strlen,top,now(),num from dual;
end//
delimiter ;
call get_gc_task2(1,2);
执行结果
其中变量我用的@AAA,就不改了。
总结
在动态语句执行时,上下文已经变了,无法直接访问调用者的本地变量,但session级的是可以用的。