PLSQL:输出多个游标的过程

时间:2012-01-02 15:46:58

标签: oracle plsql

我想在一个程序中返回多个光标,一个基于其他程序。

我目前的代码是:

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,因为它会为每次修复返回相乘的汽车)

2 个答案:

答案 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部分不知道要返回的值。

要执行您正在尝试的操作,数据库必须检测第一个查询的提取,使用第二个查询创建新的结果集,然后将新结果集放在过程最初为此返回的地址处第二个光标。数据库并不是为处理这种操作而设计的。