我将游标声明放入准备好的语句中,然后执行它,然后返回一个 error #1324 - Undefined CURSOR: getid.
我该如何解决这个问题?
定界符;; 如果存在test2,则丢弃程序; 创建过程test2(table_id VARCHAR(25)) BEGIN DECLARE完成INT DEFAULT FALSE; DECLARE ID INT; DECLARE id_new INT; 声明stmt1 VARCHAR(1024); 声明stmt2 VARCHAR(1024); 未找到的DECLARE继续处理程序已完成= 1; SET @ sqltext1:= CONCAT('DECLARE getid CURSOR FOR SELECT entryId FROM',table_id,'ORDER BY entryId'); 从@ sqltext1准备stmt1; 执行stmt1; SET @id_new = 1; OPEN getid; 将getid抓取到id中; 重复 使用@new_id,id执行stmt2; SET @ sqltext2:= CONCAT('UPDATE',table_id,'SET entryId =?WHERE entryId =?'); 从@ sqltext2准备stmt2; SET @id_new = @id_new +1; 将getid抓取到id中; 直到完成END REPEAT; CLOSE getid; 结束 ;; 呼叫test2('Test');
一些规则:
id
)用作已准备好的语句的绑定参数。您只能使用session
变量(例如@_id
)。为了克服这些问题,您可以采用以下解决方案。
以下示例应适用于您的表。
delimiter $$
drop procedure if exists test2$$
create procedure test2( table_id varchar(25) )
begin
set @temp_query = 'drop temporary table if exists temp_cursor_table';
prepare pst from @temp_query;
execute pst;
drop prepare pst; -- or
-- deallocate prepare pst;
set @temp_table_query='create temporary table temp_cursor_table ';
set @temp_table_query=concat( @temp_table_query, ' select entryId from ' );
set @temp_table_query=concat( @temp_table_query, table_id );
set @temp_table_query=concat( @temp_table_query, ' order by entryId' );
prepare pst from @temp_table_query;
execute pst;
drop prepare pst;
-- now write your actual cursor and update statements
-- in a separate block
begin
declare done int default false;
declare id int;
declare id_new int;
declare stmt1 varchar(1024);
declare stmt2 varchar(1024);
declare getid cursor for
select entryId from temp_cursor_table order by entryId;
declare continue handler for not found set done = 1;
set @id_new = 1;
open getid;
fetch getid into id;
repeat
set @sqltext2 := concat( 'update ', table_id );
set @sqltext2 := concat( @sqltext2, ' set entryId = ? where entryId = ?' );
set @_id = id;
prepare stmt2 from @sqltext2;
execute stmt2 using @new_id, @_id;
set @id_new = @id_new + 1;
fetch getid into id;
until done end repeat;
close getid;
end;
end;
$$
delimiter ;
现在,使用table_id
值调用该过程。
call test2( 'Test' );
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句