Изначально я думал просто оставить комментарий, но это требует некоторого объяснения, поэтому я пишу ответ.Вы на самом деле делаете это неправильно.В идеале вы должны передать курсор на my_stored_proc
и извлечь курсор внутри процедуры.Ваш метод фактически заставляет несколько вызовов обрабатывать каждую строку из результата запроса.Обработка будет очень медленной, если у вас огромный объем данных.Это плохая идея, даже если строк мало.
Вот пример процедуры, которая выполняет операцию dml с использованием FORALL
. Это всего лишь пример, но вы должны иметь возможность преобразовать свой запрос select таким образомчто вы должны быть в состоянии сделать 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;
/