建个存储过程用来汉字转拼音
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条,跟第二批数据一样,如果不手动终止执行,估计要几个小时才自己结束。。求帮忙看看,如果可以,帮我改进下这存储过程写法,插入拼音到当前行感觉效率比较低。

解决方案 »

  1.   

    感觉数据没问题,麻烦懂的帮我分析分析我这存储过程有没有什么问题哈。。
    SELECT hz2py_func(hz);这个是我建的一个函数,将hz转为拼音
      

  2.   

    感觉你对游标理解的比较少 ,建议好好看看相关语法和实例 ,我修改后的脚本如下 :
    DROP PROCEDURE IF EXISTS hz2py_proces_table;
    CREATE PROCEDURE hz2py_proces_table()
    BEGIN 
    DECLARE py VARCHAR(3000);
    DECLARE hz VARCHAR(500); 
    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如果效率还是比较低,如果方便 把 hz2py_func()脚本也分享一下,有可能是hz2py_func()的问题!
      

  3.   

    不好意思 ,少定义了一个变量 :
    declare done1  int default 0;
      

  4.   

    这个循环我懂,刚测试了下,游标其实在循环结束的时候是有数据取出来,但不知道为什么就会满足not found判断条件,看了下规律,如果这一行数据结尾是中文标点结尾,比如! , 。 ? 这类,游标就会满足not found 跳出循环。这个就不太懂了
      

  5.   

    测试了很多遍,用你这种判断循环结束的方式,每次当该行数据以汉字标点符号结尾时循环就会终止,如果汉字标点符号在数据中间,那不会有影响,如果换成我之前的循环方式或者把repeat退出条件换成计数的方式就不会出现这情况,但还是会出现我最开始的情况,循环一直不结束。尝试将循环计数时换成allaccount>1也不行
      

  6.   

    这个not found成立到底是什么条件?为什么遇到汉字标点符号结尾的,就成立?很奇怪。
      

  7.   

    "not found成立",游标指针下移时,没有数据 ,跳出游标循环!
    遇到中文标点符号跳出循环问题导致原因不详!
      

  8.   

    中文标点后面就是换行符,跟英文标点一样,感觉也没什么异样,删除中文标点,该行就可以执行通过,估计是中文标点在mysql中默认是结束符。
      

  9.   

    是不是因为经典问题:循环中提交导致的?mysql是自动提交的,所以每次的循环都是事务,导致慢,出现问题。
    循环之前设置改为手动提交即可。
      

  10.   

    数据库是用的myisam,自动提交应该对它影响不大吧,刚测试了下还是一样的问题,当数据量很大时慢的无法想像。
      

  11.   

    数据库是用的myisam,自动提交应该对它影响不大吧,刚测试了下还是一样的问题,当数据量很大时慢的无法想像。是我弄错了,myisam没有事物!是不是可以:show processlist 看这个连接正在干啥?
      

  12.   

    数据库是用的myisam,自动提交应该对它影响不大吧,刚测试了下还是一样的问题,当数据量很大时慢的无法想像。是我弄错了,myisam没有事物!是不是可以:show processlist 看这个连接正在干啥?
    数据量小的时候还是比较正常,700条大概10s不到可以完成。当数据量几万条的时候,show processlist现在一直有select和update操作,当我手动终止的时候查看数据其实已经全部都修改完,不懂为什么进程还一直有Update与Select操作。myisam模式下修改数据具体是个什么样的。