又遇到诡异问题了,求助各位大虾了。
我在一个存储过程里,使用了游标来进行表A数据处理。
然而在打开游标前,需要先删除表A的一些数据,于是我用了TRUNCATE TABLE来对表A进行删除记录操作。
这样,打开游标后,操作正常。
但是,由于多用户问题,我必须将TRUNCATE TABLE改成DELETE FROM语句来替换原来的TRUNCATE TABLE,问题由此产生了,删除后,游标打开表A的记录就不稳定了!!!
已经调试了好久了,始终没有找到原因啊,求助大虾们了!!!

解决方案 »

  1.   

    估计是并发的问题比如你在游标处理数据时,别的进程在执行游标前的DELETE 
      

  2.   

    你可以设A的游标为全局变量,整个数据库共享。
    同时加上锁,防止读 脏数据。DECLARE cursor_name CURSOR 
    [ LOCAL | GLOBAL ] 
    [ FORWARD_ONLY | SCROLL ] 
    [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] 
    [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] 
    [ TYPE_WARNING ] 
    FOR select_statement 
    [ FOR UPDATE [ OF column_name [ ,...n ] ] ]
    LOCAL--指定该游标的作用域对在其中创建它的批处理、存储过程或触发器是局部的。该游标名称仅在这个作用域内有效。在批处理、存储过程、触发器或存储过程 OUTPUT 参数中,该游标可由局部游标变量引用。OUTPUT 参数用于将局部游标传递回调用批处理、存储过程或触发器,它们可在存储过程终止后给游标变量指派参数使其引用游标。除非 OUTPUT 参数将游标传递回来,否则游标将在批处理、存储过程或触发器终止时隐性释放。如果 OUTPUT 参数将游标传递回来,游标在最后引用它的变量释放或离开作用域时释放。GLOBAL--指定该游标的作用域对连接是全局的。在由连接执行的任何存储过程或批处理中,都可以引用该游标名称。该游标仅在脱接时隐性释放。看你的要求是要read_only
    还是SCROLL_LOCKS(指定确保通过游标完成的定位更新或定位删除可以成功)
    还是OPTIMISTIC 指定如果行自从被读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不成功