我想在一个程序中返回多个光标,一个基于其他程序。
我目前的代码是:
TYPE REFCURSOR IS REF CURSOR;
PROCEDURE GETCARS(oCARS OUT REFCURSOR)
BEGIN
OPEN oCARS FOR SELECT * FROM CARS;
END GETCARS;
我不确定这是否可行,但我想做出类似的事情:
PROCEDURE GETCARS(oCARS OUT REFCURSOR, oREPAIRS OUT REFCURSOR)
BEGIN
OPEN oCARS FOR SELECT * FROM CARS;
..??..
END GETCARS;
将作为第二个参数返回与当前获取的oCARS行相关的所有修复。 (表维修对汽车的id_car有FK)
现在我在C#端执行此操作,当我从oCARS游标中获取一行时,我调用了第二个过程,它给出了修复列表,但也许在某个过程中可以实现这一点(这会给我带来性能提升? - 我不想使用join,因为它会为每次修复返回相乘的汽车)
答案 0 :(得分:2)
怎么样
PROCEDURE GETCARS(oCARS OUT SYS_REFCURSOR, oREPAIRS OUT SYS_REFCURSOR, oCHARGES OUT SYS_REFCURSOR)
BEGIN
OPEN oCARS FOR SELECT * FROM CARS;
OPEN oREPAIRS FOR SELECT * FROM REPAIRS;
OPEN oCHARGES FOR SELECT * FROM CHARGES;
END GETCARS;
分享并享受。
答案 1 :(得分:1)
简单的答案是,你不能做你正在尝试的事情。
游标基本上只是指向包含查询结果的结果集开头的指针。在获取行之前,无法知道该行将包含哪些内容。因为您的应用程序而不是PL / SQL代码正在进行提取,所以PL / SQL部分不知道要返回的值。
要执行您正在尝试的操作,数据库必须检测第一个查询的提取,使用第二个查询创建新的结果集,然后将新结果集放在过程最初为此返回的地址处第二个光标。数据库并不是为处理这种操作而设计的。