MySQL中怎样检查系统中是否已有同名的光标

ChinaITOldMan 2019-04-01 10:49:52
请问MySQL中怎样检查系统中是否已有同名的光标?用SQL代码怎样写,谢谢!
...全文
279 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChinaITOldMan 2019-09-12
  • 打赏
  • 举报
回复
请问哪位大虾能否帮看看,谢谢!
sulinly 2019-09-12
  • 打赏
  • 举报
回复
不知道你明白没,当你某个原因要跳出时可能有两种情况。1、跳出时,你同时关闭内循环游标就行了。下次再open的时候不会报错。2、如果你还想保留内循环的当前位置,下次进入内循环是继续那个位置进行循环。这种情况你就需要定义个状态变量。比如设置状态变量为true是想保留内循环位置(你某个原因跳出时)。这时下次进入内循环时判断如果状态变量为true,则不再open游标,因为游标已经open。正常内循环完后设置状态变量为false。
sulinly 2019-09-12
  • 打赏
  • 举报
回复
如果你内循环跳出时,二次进入时还需要继续循环刚才的内循环,也很简单啊,设置个变量作为标志。
如果是需要继续接着上次的内循环,标志变量为true。标志变量为true时不再open内循环游标就行了。
sulinly 2019-09-12
  • 打赏
  • 举报
回复
跳出内循环游标时关闭了就行了啊,关闭了还判断它干嘛。。。
ChinaITOldMan 2019-04-05
  • 打赏
  • 举报
回复
请问哪位大虾能否帮看看,谢谢!
ChinaITOldMan 2019-04-03
  • 打赏
  • 举报
回复
跳出循环我知道,现在问题是怎样在循环中判断某一cursor是否已经被定义与使用。
AHUA1001 2019-04-03
  • 打赏
  • 举报
回复
这个也有办法,你在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 ;
只要给循环里的条件,设置一个可以跳出循环的值即可。
ChinaITOldMan 2019-04-03
  • 打赏
  • 举报
回复
因为我有时因某一条件需要跳出内层循环,有嵌套循环,所以我要在代码中检查是否存在该cursor,否则再次打开已经存在的cursor会出错的
AHUA1001 2019-04-03
  • 打赏
  • 举报
回复
我的理解,就是嵌套循环,对吧。
如果这样,就不用考虑内层的循环是否结束了,因为内层的循环没有结束,后续的就不会再执行。
AHUA1001 2019-04-02
  • 打赏
  • 举报
回复
您可以试试看这个语句
SELECT * FROM mysql.proc t WHERE t.db = SCHEMA() AND UPPER(t.body) LIKE '%CURSOR%' ;
AHUA1001 2019-04-02
  • 打赏
  • 举报
回复
引用 2 楼 mcxhh2005 的回复:
[quote=引用 1 楼 AHUA1001 的回复:]
光 标 指 什 么


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

谢谢[/quote]

您说的是游标吧,存储过程里定义的。
ChinaITOldMan 2019-04-02
  • 打赏
  • 举报
回复
引用 1 楼 AHUA1001 的回复:
光 标 指 什 么
就是Cursor 我是想怎样检查我是否已经在系统中定义(或正在使用)某一cursor,或叫游标吧。 谢谢
AHUA1001 2019-04-02
  • 打赏
  • 举报
回复
光 标 指 什 么
ChinaITOldMan 2019-04-02
  • 打赏
  • 举报
回复
是这样的,有两个Cursor,一个是外层的Cursor,一个是内层的Cursor, 因为内层cursor是定义在外层cursor内,为了程序的安全,所以在外层Cursor每取一行后再执行内层Cursor的时候, 我先检查下内层Cursor的是否有存在或打开,若有,就先释放在关闭,然后执行内层cursor的定义等一些相关的操作。就是想实现这个功能,谢谢您!
AHUA1001 2019-04-02
  • 打赏
  • 举报
回复
以我目前的知识储备,可以通过“SHOW PROCESSLIST;”语句查询正在执行的进程。这个语句查询出的id,可以通过“kill id;”来结束进程。
但是“SHOW PROCESSLIST;”的查询结果,不能确定是cursor的进程。你可以通过cursor里执行的语句,来判断是否是你需要的进程,但是要能确定唯一性,否则会误杀其它进程。
另外,还要问一下,为什么要结束正在执行的cursor,这样的操作,可能会导致误杀错误的进程,导致数据的不完整行,不建议这样的操作。
最好能详细的说一下您的需求,可能还有其它的方案来处理您的问题。
ChinaITOldMan 2019-04-02
  • 打赏
  • 举报
回复
引用 6 楼 AHUA1001 的回复:
总结一下,您的需求分3个部分。 1、判断哪个存储过程用到了CURSOR。 2、判断哪个包含CURSOR 的存储过程,正在执行。 3、关闭正在运行的这个包含CURSOR的存储过程。 是这个意思吗。
引用 6 楼 AHUA1001 的回复:
总结一下,您的需求分3个部分。 1、判断哪个存储过程用到了CURSOR。 2、判断哪个包含CURSOR 的存储过程,正在执行。 3、关闭正在运行的这个包含CURSOR的存储过程。 是这个意思吗。
谢谢你!没上面复杂,因为我是在一个循环中调用类似下面的代码,我只需要在当前的存储过程中检查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
AHUA1001 2019-04-02
  • 打赏
  • 举报
回复
总结一下,您的需求分3个部分。
1、判断哪个存储过程用到了CURSOR。
2、判断哪个包含CURSOR 的存储过程,正在执行。
3、关闭正在运行的这个包含CURSOR的存储过程。
是这个意思吗。
ChinaITOldMan 2019-04-02
  • 打赏
  • 举报
回复
引用 4 楼 AHUA1001 的回复:
您可以试试看这个语句 SELECT * FROM mysql.proc t WHERE t.db = SCHEMA() AND UPPER(t.body) LIKE '%CURSOR%' ;
你这个是查询存储过程中是否有定义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 是否 存在,若存在就先关闭

57,066

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧