南大通用GBase 8a执行包含select into 变量动态SQL

一个动态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级的是可以用的。