Oracle存储过程 - 执行所有选择结果

时间:2018-05-28 13:42:03

标签: oracle stored-procedures oracle11g

假设我有一个存储过程接受2个varchars,做一些处理并更新我的业务表。有没有办法可以运行存储过程来获取选择查询的结果?

喜欢,

execute my_stored_proc select varchar_1,varchar_2 from an_ip_table;

3 个答案:

答案 0 :(得分:2)

您可以循环遍历结果

BEGIN
   FOR RECS IN (SELECT varchar_1, varchar_2 FROM an_ip_table)
   LOOP
      my_stored_proc (RECS.varchar_1, RECS.varchar_2);
   END LOOP;
END

答案 1 :(得分:1)

这可能是一个简单的方法:

begin
    for i in (
                select varchar_1, varchar_2
                from an_ip_table
              )
    loop
        my_stored_proc(i.varchar_1, i.varchar_2);
    end loop;
end;  

答案 2 :(得分:0)

最初,我只是想发表评论,但这需要一些解释,所以我写了一个答案。你实际上是以错误的方式做事。理想情况下,您应该将光标传递给my_stored_proc并在过程中提取光标。您的方法实际上会导致多次调用到查询结果中的每一行的过程。如果您拥有大量数据,处理速度将非常慢。即使行数很少,这也是一个坏主意。

以下是使用FORALL执行dml操作的示例过程。它只是一个示例,但您应该能够转换您的选择查询,以便您能够以这种方式执行dml。

CREATE OR REPLACE PROCEDURE my_stored_proc (
    p_iptab_cur SYS_REFCURSOR
) AS

    TYPE iprec IS RECORD ( col1   an_ip_table.col1%TYPE,
    col2   an_ip_table.col1%TYPE );
    TYPE iptype IS
        TABLE OF iprec;
    ips    iptype;
BEGIN
    FETCH p_iptab_cur BULK COLLECT INTO ips;

    FORALL i IN ips.FIRST..ips.LAST 
    --Your DML--  using the collection of records.
END;
/


--Calling the procedure by passing the `CURSOR`

DECLARE
  x SYS_REFCURSOR;
BEGIN
   OPEN x FOR select col1, col2
                from an_ip_table;
   my_stored_proc(x);
END;
/