Sql 将不同(多个)游标传递给同一For循环

Sql 将不同(多个)游标传递给同一For循环,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,为更好地澄清而编辑: 2009年1月28日新增:为了便于解释,我过度简化了代码,但select语句非常长且复杂,第二个语句依赖于第一个含义,在第一个光标完成并循环通过并创建插入后,第二个select实际上将第一个插入作为where子句的一部分进行查看 这就是为什么我需要多次使用循环,而不是以任何方式组合选择。 当我按照我想调用它们的顺序调用它们时,我需要它们运行,这让我回到了我最初的问题:是否需要使用不同的游标重复使用循环 再次感谢 我正在创建一个包(Oracle10),其中有4个不同的se

为更好地澄清而编辑:


2009年1月28日新增:为了便于解释,我过度简化了代码,但select语句非常长且复杂,第二个语句依赖于第一个含义,在第一个光标完成并循环通过并创建插入后,第二个select实际上将第一个插入作为where子句的一部分进行查看

这就是为什么我需要多次使用循环,而不是以任何方式组合选择。 当我按照我想调用它们的顺序调用它们时,我需要它们运行,这让我回到了我最初的问题:是否需要使用不同的游标重复使用循环

再次感谢


我正在创建一个包(Oracle10),其中有4个不同的select语句(可能还会有更多),我为所有这些语句创建一个游标并获取数据。现在通常我会获取数据并创建一个For循环,一切都很好

我的问题是,我有4个不同的选择,但我想重复使用循环,这样我可以让游标c2利用相同的循环以及c3和c4。所有这些都是从不同的选择中获取不同信息的游标,但它们都与循环中的insert语句一起进入同一个表。此外,我不能将所有选择连接在一起,它们必须在每次循环后按顺序提交

我在下面创建了一个包含4个循环的示例,但正如您所看到的,它们都是相同的,唯一的区别是:对于c1循环中的r,对于c2循环中的r。。。 我想一定有办法重用这个循环。我有一些想法,但都不管用

 cursor c1 is  select info_a, info_b from table_x where info_g = 77; 
 cursor c2 is  select info-a, info_b from table_x where info_g = 88;
 cursor c3 is  select info-a, info_b from table_y where info_j = 88;
 cursor c4 is  select info-a, info_b from table_y where info_j = 99;


  Begin

     For r in c1 loop
        insert into fun_table (good_info, boring_info) values (r.info_a, r.info-b);
     end loop;
    commit;

     For r in c2 loop
        insert into fun_table (good_info, boring_info) values (r.info_a, r.info-b);
     end loop;
    commit;

     For r in c3 loop
        insert into fun_table (good_info, boring_info) values (r.info_a, r.info-b);
     end loop;
    commit;

     For r in c4 loop
        insert into fun_table (good_info, boring_info) values (r.info_a, r.info-b);
     end loop;
    commit;

   end;
希望这更有意义,谢谢

我编辑了一下,然后收到了一些答案。。很抱歉 原作是这样的:

 cursor c1 is  select some_info, other_info from some_table where where some_thing = 'xyz'; 
cursor c2 is select some_info, other_info from some_table where where some_thing = 'abc';

   For r in c1 loop
        insert into fun_table (good_info, boring_info) values (r.some_info, r.other_info);
    end loop;

因此,您将有以下select语句:

select some_info, other_info from some_table where some_thing = 'xyz'; 
select c2_info, c2_other from c2_table where c2_thing = 'XYZ;'
为此,可以将c1声明为其他未知类型的SYS_REFCURSOR,并确保每个查询的所有列都属于相同类型(或接近该类型)。您不能使用行类型,您必须单独声明列,并声明适用于所有查询的泛型类型。但以下方法确实有效

DECLARE
  C1 SYS_REFCURSOR;
  TableID NUMBER;
  TableName VARCHAR2(240);
BEGIN

  OPEN C1 FOR select CALENDAR_ID, CALENDAR_NAME from CALENDARS;

  LOOP
    FETCH C1 INTO tableid, tablename;
    EXIT WHEN C1%NOTFOUND;
    DBMS_OUTPUT.put_line ('ID: ' || to_char(tableID) || ' -- NAME: ' || TableName);
  END LOOP;
  CLOSE C1;
  OPEN C1 for SELECT INIT_ID, NAME FROM INITS;  
  LOOP
    FETCH C1 INTO tableid, tablename;
    EXIT WHEN C1%NOTFOUND;
    DBMS_OUTPUT.put_line ('ID: ' || to_char(tableID) || ' -- NAME: ' || TableName);
  END LOOP;
  CLOSE C1;
END;
只要做:

begin
  insert into cool_table 
  ( neat_info 
  , boring_info)
  select some_info
  ,      other_info 
  from some_table 
  where some_thing = 'XYZ';
end;
不需要光标循环

或者干脆做:

cursor c1 is  
select info_a, info_b from table_x where info_g IN (77, 88) UNION ALL
select info-a, info_b from table_y where info_j IN (88, 99);

Begin

     For r in c1 loop
        insert into fun_table (good_info, boring_info) values (r.info_a, r.info-b);
     end loop;
    commit;

END;

为什么不动态构建游标查询并只使用一个游标

其中77、88和99来自存储过程中的参数

cursor c1 is  
select info_a, info_b from table_x where info_g in( 77, 88)
UNION
select info-a, info_b from table_y where info_j in (88, 99)
...

如果有人需要知道如何做到这一点,这里有一个有效的答案。 正如我办公室另一个做过研究的人给我的:

我创建了一个包含2个过程的包 第一个是多个游标,第二个是循环 (我过度简化了选择和插入,只是为了展示它是如何完成的)

第一个过程称为选择光标:

procedure Select_Cursors is 

  the_cursor sys_refcursor;    -- this defines the_cursor as type sys_refcursor  

begin

 open the_cursor for 

     select  application_idn, account_idn     
      from accounts ac,  applications ha
     where  something = somethingelse

 Insert_Cursor ( the_cursor );  
 close the_cursor;

  open the_cursor for 

     select  application_idn, account_idn     
      from accounts ac,  applications ha
     where  somethingfunny = somethingcrazy

  Insert_Cursor ( the_cursor );  
 close the_cursor;


 ...  repeat for every select

 end Select_Cursors; 
第二个过程称为插入光标:

procedure Insert_Cursor ( p_cursor in sys_refcursor ) is


    begin

       loop
            fetch p_cursor into  application_idn, account_idn ;
            exit when p_cursor%notfound;

            insert into payments (issue_type_des, issued_amt, payment_Type_cde,payment_Status_Cde, created_by, application_idn, account_idn)
                 values          (v_paytype, v_amount, 'S','PE','This Process',  application_idn, account_idn);
       end loop;

       commit;

    end Insert_Cursor;

再次感谢所有给出答案并调查问题的人,非常感谢

请发布您希望如何查看它(可能是一些未编译但让我们了解您想要什么的代码)在for循环中:对于使用c1的c1循环中的r,我希望传入任何游标,因此它可以是:对于c2循环中的r,或者:对于d1循环中的r,或者任何要循环的数据集,可以显示不同的SQL吗?为什么插入时需要游标?只需使用插入…选择。。。声明。考虑基于集合而不是基于行。