请问MySQL中怎样检查系统中是否已有同名的光标?用SQL代码怎样写,谢谢!

解决方案 »

  1.   


    就是Cursor
    我是想怎样检查我是否已经在系统中定义(或正在使用)某一cursor,或叫游标吧。谢谢
      

  2.   


    就是Cursor
    我是想怎样检查我是否已经在系统中定义(或正在使用)某一cursor,或叫游标吧。谢谢您说的是游标吧,存储过程里定义的。
      

  3.   

    您可以试试看这个语句
    SELECT * FROM mysql.proc t WHERE t.db = SCHEMA() AND UPPER(t.body) LIKE '%CURSOR%' ;
      

  4.   


    你这个是查询存储过程中是否有定义Cursor的,我的意思是在同一个存储过程中,先检查某一个cursor是否有被定义或使用,若使用某一cursor在使用,先关闭它。我在一个循环中定义cursor的,所以先要实现下面代码中中文那一行描述的功能,请问怎样写?多谢!SELECT * FROM mysql.proc t WHERE t.db = SCHEMA() AND UPPER(t.body) LIKE '%cur1%' ;
    DECLARE cur1 CURSOR FOR SELECT *  FROM test;
    open cur1 ;if 检查cur1 是否 存在,若存在就先关闭
      

  5.   

    总结一下,您的需求分3个部分。
    1、判断哪个存储过程用到了CURSOR。
    2、判断哪个包含CURSOR 的存储过程,正在执行。
    3、关闭正在运行的这个包含CURSOR的存储过程。
    是这个意思吗。
      

  6.   

    谢谢你!没上面复杂,因为我是在一个循环中调用类似下面的代码,我只需要在当前的存储过程中检查cur1是否存在,若存在就关闭。
    需要需要实现下面中文描述对应的代码就可以,多谢你!SELECT * FROM mysql.proc t WHERE t.db = SCHEMA() AND UPPER(t.body) LIKE '%cur1%' ;
    DECLARE cur1 CURSOR FOR SELECT *  FROM test;
    open cur1 ;if cur1 存在 then 
      关闭
    end if
      

  7.   

    以我目前的知识储备,可以通过“SHOW PROCESSLIST;”语句查询正在执行的进程。这个语句查询出的id,可以通过“kill id;”来结束进程。
    但是“SHOW PROCESSLIST;”的查询结果,不能确定是cursor的进程。你可以通过cursor里执行的语句,来判断是否是你需要的进程,但是要能确定唯一性,否则会误杀其它进程。
    另外,还要问一下,为什么要结束正在执行的cursor,这样的操作,可能会导致误杀错误的进程,导致数据的不完整行,不建议这样的操作。
    最好能详细的说一下您的需求,可能还有其它的方案来处理您的问题。
      

  8.   

    是这样的,有两个Cursor,一个是外层的Cursor,一个是内层的Cursor, 因为内层cursor是定义在外层cursor内,为了程序的安全,所以在外层Cursor每取一行后再执行内层Cursor的时候, 我先检查下内层Cursor的是否有存在或打开,若有,就先释放在关闭,然后执行内层cursor的定义等一些相关的操作。就是想实现这个功能,谢谢您!
      

  9.   

    因为我有时因某一条件需要跳出内层循环,有嵌套循环,所以我要在代码中检查是否存在该cursor,否则再次打开已经存在的cursor会出错的
      

  10.   

    这个也有办法,你在CURSOR的时候,其实就是一个循环每一次循环都要有条件的,例如
                   OPEN cursor_name;  
                       FETCH  cursor_name INTO i_1,i_2……;  
                       WHILE s <> 1 AND aaa = 1 DO  
                               ……  
                               FETCH  cursor_name INTO i_1,i_2……;  
                         -- 如果想跳出循环,在这里给aaa设定一个不等于的值,例如 aaa=2。
                       END WHILE;  
                    CLOSE cursor_name ;  
    只要给循环里的条件,设置一个可以跳出循环的值即可。   
      

  11.   

    跳出循环我知道,现在问题是怎样在循环中判断某一cursor是否已经被定义与使用。
      

  12.   

    如果你内循环跳出时,二次进入时还需要继续循环刚才的内循环,也很简单啊,设置个变量作为标志。
    如果是需要继续接着上次的内循环,标志变量为true。标志变量为true时不再open内循环游标就行了。
      

  13.   

    不知道你明白没,当你某个原因要跳出时可能有两种情况。1、跳出时,你同时关闭内循环游标就行了。下次再open的时候不会报错。2、如果你还想保留内循环的当前位置,下次进入内循环是继续那个位置进行循环。这种情况你就需要定义个状态变量。比如设置状态变量为true是想保留内循环位置(你某个原因跳出时)。这时下次进入内循环时判断如果状态变量为true,则不再open游标,因为游标已经open。正常内循环完后设置状态变量为false。