2012-04-05 19 views
3

我有一个存储过程与下面的基本布局,作为结果集返回一个sys_refcursor。 (从技术上讲,它重新启动了四个,但为了清晰起见,我只说一个)。结果集是从临时表中选择的。如何从一个存储过程中从SYS_REFCURSOR中获取数据并在另一个存储过程中使用它?

procedure aProcedure 
(C1 in out sys_refcursor 
) is 
begin 
--populate Temp_Table here with a stored proc call; 
OPEN C1 FOR 
SELECT Cols 
FROM TEMP_TABLE; 

我需要使用不同的存储过程将此结果集从C1插入到永久表中。这是否可行或是否需要重新构建结果集?

我已经能够找到有关使用Oracle以外的游标和结果集的信息,但不能在其内部使用它们。

我知道从第一个存储过程插入数据是有意义的,但这并不是我真正需要的。这是一个可选的要求,永久保存结果集。

感谢您的任何有用的信息。

+0

为什么你需要在2个过程中做到这一点?为什么不是1? – Ben 2012-04-05 19:44:16

回答

11

假设调用者知道aProcedure正在打开的光标的结构,可以这样做。

declare 
    l_rc sys_refcursor; 
    l_rec temp_table%rowtype; 
begin 
    aProcedure(l_rc); 
    loop 
    fetch l_rc 
    into l_rec; 
    exit when l_rc%notfound; 

    dbms_output.put_line(l_rec.col1); 
    end loop; 
    close l_rc; 
end; 
/

如果无法读取到记录类型,也可以读取到其他一些标局部变量(数量和类型必须匹配列的数量和类型aProcedure指定其SELECT的列表)。在我的情况下,我定义了aProcedure返回两个数字列

declare 
    l_rc sys_refcursor; 
    l_col1 number; 
    l_col2 number; 
begin 
    aProcedure(l_rc); 
    loop 
    fetch l_rc 
    into l_col1, l_col2; 
    exit when l_rc%notfound; 
    dbms_output.put_line(l_col1); 
    end loop; 
    close l_rc; 
end; 
+0

感谢您花时间回答贾斯廷这个问题。这很有道理,尽管我有四个不同的游标从两个临时表中生成数据,还有一个视图需要收集并插入到一个不同的表中。它会让我的新生大脑有一段时间来正确实施它。这绝对是让我朝着正确的方向发展。 – dee 2012-04-10 14:55:29

相关问题