定义了一个游标,能否在不同存储过程中同时引用它?不知道这样做并发使用时会不会有问题,在网上一直没搜到好的解释,请大家帮忙解释回答一下,谢谢!

解决方案 »

  1.   

    在package包里定义的cursor可以认为是一个对象; 每次在不同的procedure引用就相当于对这个对象一次实例化过程。
    并发时不会导致问题。
      

  2.   


    SQL> 
    SQL> create or replace package pack_test
      2  is
      3    cursor list is select * from dual;
      4  end pack_test;
      5  /Package createdSQL> create or replace package body pack_test is
      2  begin
      3      null;
      4  end pack_test;
      5  /Package body createdSQL> set serveroutput on
    SQL> begin
      2      if (pack_test.list%isopen) then
      3          close pack_test.list;
      4      end if;
      5      for i in pack_test.list
      6      loop
      7          dbms_output.put_line(i.dummy);
      8      end loop;
      9  end;
     10  /XPL/SQL procedure successfully completedSQL> set serveroutput off
    SQL> 
      

  3.   

    不会有问题的。如果你的游标里面没有for update来加锁,其实就相当于一句纯select,而oracle是不会对纯select加锁的。
    需要多次定义的游标,可以定义在package里面。
    但是如果数据有变化,第一次和第二次打开同一个游标,返回的结果集有可能不同(因为相当于两次查询)。
      

  4.   

    建议楼主不游标的定义放在package中,这个相当于一个全局变量,以后什么地方使用到该游标,调用之,挺方便的。