我有两个表A和B,这两个表有一个共同字段C,分别为这两个表建立游标。
伪代码:cursor cur_A is select * from A;cursor cur_B is select * from B;fetch cur_A.C into var_D;
loop
    for var_D in cur_B.C
    loop
    
    end loop;
end loop;结果一运行提示“子程序活游标cur_A引用超出范围”“子程序活游标cur_B引用超出范围”

解决方案 »

  1.   

    你的OPEN语句呢,关闭语句呢,完整格式:
    cursor emp_cur is select .....;
    begin
    open emp_cur;
     fetch into ;
     for in loop
      end loop;
     close  emp_cur;
    end;
      

  2.   

    主要是你第一个LOOP没有控制,是一个死循环。应该有一个判断NOTFOUND的时候exit的语句
      

  3.   


    --这样修改下..我最不喜欢fetch那样的模式...呵呵
    for cur_A in (select * from A)
    loop
        for cur_B in (select * from B)
        loop
        
        end loop;
    end loop;
      

  4.   

    没有过多控制的话使用隐式游标就挺好。
    for cur_A in (select * from A)
    loop
        for cur_B in (select * from B)
        loop
        
        end loop;
    end loop;
      

  5.   


    fetch游标之前要open游标。
      

  6.   


      --2
      cursor cur_crm_barcode is
      select * from xry_crm_barcode;
      
      --3
      cursor cur_onhandnum_barcode is 
      select * from rs_onhandnum_barcode;     --open cur_crm_barcode;
         --open cur_onhandnum_barcode;
         fetch cur_crm_barcode.resource_instance_code into var_crm_vbarcode;
         --exit when cur_crm_barcode %NOTFOUND;
         loop
         --exit when cur_crm_barcode %NOTFOUND;
             for var_crm_vbarcode in cur_onhandnum_barcode.vbarcode
             loop
             --exit when cur_onhandnum_barcode %NOTFOUND;
                 select count(*) into var_count from rs_onhandnum_barcode where vbarcode=var_crm_vbarcode 
                 and storage_id=cur_crm_barcode.storage_code
                 and pk_invbasdoc=cur_crm_barcode.dev_subtype;
                 --具体的还没写完
                            
             end loop;
         
         end loop;
         --close cur_crm_barcode;
         --close cur_onhandnum_barcode;
      

  7.   

    Declare
      Cursor Cur_Crm_Barcode Is
        Select * From Xry_Crm_Barcode;
      Cursor Cur_Onhandnum_Barcode Is
        Select * From Rs_Onhandnum_Barcode;
    Begin
      Open Cur_Crm_Barcode;
      Loop
        Fetch Cur_Crm_Barcode.Resource_Instance_Code
          Into Var_Crm_Vbarcode;
        Exit When Cur_Crm_Barcode%Notfound;
        
        For Var_Crm_Vbarcode In Cur_Onhandnum_Barcode.Vbarcode Loop
          Select Count(*)
            Into Var_Count
            From Rs_Onhandnum_Barcode
           Where Vbarcode = Var_Crm_Vbarcode
             And Storage_Id = Cur_Crm_Barcode.Storage_Code
             And Pk_Invbasdoc = Cur_Crm_Barcode.Dev_Subtype;
        End Loop;
        
      End Loop;
      Close Cur_Crm_Barcode;
    End;应该是这样的把?
    我不知道你到底要个什么样的功能。
      

  8.   


    declare
    cursor cur_crm_barcode is select * from xry_crm_barcode;
      
    cursor cur_onhandnum_barcode is select * from rs_onhandnum_barcode;
    var_count  number;
    begin     for a in cur_crm_barcode loop
             for b in cur_onhandnum_barcode loop
                 select count(*) into var_count 
                 from rs_onhandnum_barcode 
                where vbarcode=a.var_crm_vbarcode 
                  and storage_id=a.storage_code
                  and pk_invbasdoc=a.dev_subtype;
             end loop;
         end loop;
    end;
      

  9.   

    fetch用法错误
    fetch后面应该跟游标名,不能是游标。字段的形式,而且select多少字段into后面就应该跟多少个变量
      

  10.   


    我fetch后面跟的都是游标名啊。
      

  11.   

    按照下面的修改一下就没问题了,你犯得错主要是按照“游标名.字段名”取值,这样是不对的。还有如果用for loop的格式遍历游标,游标是不需要显式打开或者关闭的,Oracle会自动处理打开、关闭。create or replace procedure pp is cursor cur_crm_barcode is
      select * from xry_crm_barcode;
      
      --3
      cursor cur_onhandnum_barcode is 
      select * from rs_onhandnum_barcode;
      v_code xry_crm_barcode.storage_code%type;
      v_type xry_crm_barcode.dev_subtype%type;
    begin 
         open cur_crm_barcode;      
         
         loop
         exit when cur_crm_barcode %NOTFOUND;
         fetch cur_crm_barcode into v_code,v_type;
             --for var_crm_vbarcode in cur_onhandnum_barcode.vbarcode
             for var_crm_vbarcode in cur_onhandnum_barcode
             loop
             exit when cur_onhandnum_barcode %NOTFOUND;
                -- select count(*) into var_count from rs_onhandnum_barcode where vbarcode=var_crm_vbarcode
                select count(*) into var_count from rs_onhandnum_barcode where vbarcode=var_crm_vbarcode.vbarcode
                 --and storage_id=cur_crm_barcode.storage_code
                 --and pk_invbasdoc=cur_crm_barcode.dev_subtype;
                 and storage_id=v_code
                 and pk_invbasdoc=v_type;
                 --具体的还没写完
                            
             end loop;       
         
         end loop;
         close cur_crm_barcode;
         
         end pp;
      

  12.   

    你写的fetch用法是
    fetch cur_crm_barcode.resource_instance_code into var_crm_vbarcode;
    你的格式是fetch后面跟游标名(cur_crm_barcode)。字段名(resource_instance_code ),这个用法是错误的
    正确格式是fetch 游标名 into 变量名
    其中变量名的个数要跟游标中select后面字段个数相同,或者是一个结果集变量
    你用11楼的代码就可以实现你要的功能