mysql存储过程循环结束异常(汉字转拼音)


   
  DROP PROCEDURE IF EXISTS hz2py_proces_table;
  
CREATE PROCEDURE hz2py_proces_table()
BEGIN
DECLARE py VARCHAR(3000);
DECLARE hz VARCHAR(500);
DECLARE allaccount INT;
DECLARE onlyCur CURSOR FOR SELECT MSGCONTENT FROM table;
SELECT COUNT(*) INTO allaccount FROM table;
OPEN onlyCur;
WHILE allaccount > 0 DO
FETCH onlyCur INTO hz;
SET py = (SELECT hz2py_func(hz)); #汉字转拼音函数
UPDATE table SET hz2py = py WHERE MSGCONTENT = hz;
SET allaccount = allaccount - 1;
END WHILE;
CLOSE onlyCur;
END;

我的目的是要将汉字列转为拼音,有多批数据,第一批数据700多条,执行大概3s的样子,第二批数据6W条,第一次执行的是时候执行了一个多小时在结束,当时觉得有问题,第二次执行的时候我特意在一分钟不到的样子给中断,结果是汉字已经全部转为了拼音,就是说循环已经执行完,但没有停止,第三批数据100W条,跟第二批数据一样,如果不手动终止执行,估计要几个小时才自己结束。。求帮忙看看,如果可以,帮我改进下这存储过程写法,插入拼音到当前行感觉效率比较低。
后来改进了下

   
  DROP PROCEDURE IF EXISTS hz2py_proces_table;
  
CREATE PROCEDURE hz2py_proces_table()
BEGIN
DECLARE py VARCHAR(3000);
DECLARE hz VARCHAR(500);
declare done1 int default 0;
DECLARE onlyCur CURSOR FOR SELECT MSGCONTENT FROM table;
declare continue handler for not found set done1 = 1;
open onlyCur;
repeat
fetch onlyCur into hz ;
if not done1 then
SET py = (SELECT hz2py_func(hz));
UPDATE table SET hz2py = py WHERE MSGCONTENT = hz;
end if;
until done1 end repeat;
close onlyCur;
commit;
END;

这个时候出现别的问题了,每次当游标提取到以汉字标点符号结尾的数据时,循环就终止了。

mysql 存储过程

Mayf42 11 years, 8 months ago

Your Answer