免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3133 | 回复: 0
打印 上一主题 下一主题

IQ存储过程中使用游标时报Cursor not open的解决方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-15 10:57 |只看该作者 |倒序浏览
最近一位网友问了我一个问题,他在一个项目中编写了一个存储过程,这个存储过程用于把一个用户下的所有表和存储过程授权给另一个用户。代码如下:

CREATE PROCEDURE P_ALL_GRANT
as
begin
   declare @S_SQL varchar(2000)
   declare DARECESL dynamic scroll cursor for
         select aa='grant select on LC_FJGS.' || name || ' to LC_FJGSYM' from sysobjects where uid = '109'
                 and name <> 'SYSOPTIONDEFAULTS' and type in('U','V') union
         select aa='grant EXECUTE on LC_FJGS.' || proc_name || ' to LC_FJGSYM' from SYSPROCEDURE where creator = '109'
                 and proc_name <> 'P_ALL_GRANT'
   open DARECESL
   fetch next DARECESL into @S_SQL
   while(@@sqlstatus = 0)
     begin
       print @S_SQL
       execute(@S_SQL)
       fetch next DARECESL into @S_SQL
     end
   close DARECESL
   deallocate cursor DARECESL
end;


      这个存储过程编译的时候没有问题,但是在执行时报如下错误:
Could not execute statement.
   Cursor not open
   SQLCODE=-180, ODBC 3 State="34000"
   Line 1, column 1
   execute P_ALL_GRANT

      我分析了一下他的存储过程代码,基本的写法没有什么大问题:这个存储过程使用了动态sql语句技术执行grant授权操作。由于grant语句是一种DDL语句,执行后IQ会自动提交事物。在缺省情况下,打开的游标会因为事物提交而自动关闭,所以会报cusor not open错误。

      找到原因解决方法也就不难了,需要在open cursor的时候加上with hold(即改为open DARECESL with hold),这样即使提交事物也不会关闭游标了。让网友按照上面的方法修改,问题解决!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP