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吗?为什么插入时需要游标?只需使用插入…选择。。。声明。考虑基于集合而不是基于行。