Oracle 存储过程 - 游标内循环

Posted

技术标签:

【中文标题】Oracle 存储过程 - 游标内循环【英文标题】:Oracle stored procedure - Loop within cursor 【发布时间】:2012-05-03 16:53:43 【问题描述】:

我有一个存储过程Procedure1,

    在 Procedure1 中,我正在调用另一个返回 sys_refcursor ProcResult2 的过程 Procedure2。 我需要遍历这个游标的每一行并将数据插入到一个表中

代码

Create Procedure1()  
as   
ProcResult1 Sys_refcursor;  
begin  
    Procedure2(ProcResult2);  
    For eachrow in ProcResult2  
      Loop  
        insert into test_table(ProcResult2.Id);  
      end loop;  
end ;\  

任何想法,关于如何实现 2. 功能的指针?也就是遍历 ProcResult2 中返回的每一行,插入到一个新表中。

【问题讨论】:

【参考方案1】:

你快到了:

Create Procedure1()  
as   
    ProcResult1 Sys_refcursor;  
    v_record ???; -- See below
begin  
    Procedure2(ProcResult2);  
    Loop  
        fetch ProcResult2 into v_record;
        exit when ProcResult2%notfound;
        insert into test_table(v_record.Id);  
    end loop;  
    close ProcResult2;
end;

您需要使用与游标返回的结构相匹配的结构声明变量 v_record - 即,您需要在构建过程时知道游标记录的结构。如果光标返回“select * from mytab”,那么您可以使用:

v_record mytab%rowtype;

但如果它只选择某些列,例如"select col1, col3 from mytab" 那么你需要手动定义结构:

type v_record_type is record (col1 number, col3 varchar2(10));
v_record v_record_type;

【讨论】:

以上是关于Oracle 存储过程 - 游标内循环的主要内容,如果未能解决你的问题,请参考以下文章

Oracle存储过程游标for循环怎么写

Oracle存储过程游标for循环怎么写

调用存储过程的Oracle游标循环

oracle存储过程中循环for in是如何使用的

oracle存储过程怎么写循环

oracle 执行存储过程 无法中断 但是是循环执行 怎么办