Хранимая процедура Oracle - выполнить для всех выбранных результатов - PullRequest
0 голосов
/ 28 мая 2018

Скажем, у меня есть хранимая процедура, которая принимает 2 архива, выполняет некоторую обработку и обновляет мои бизнес-таблицы.Можно ли как-нибудь запустить хранимую процедуру для результатов запроса select?

Как,

execute my_stored_proc select varchar_1,varchar_2 from an_ip_table;

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Вы можете перебрать результаты по циклу

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
0 голосов
/ 28 мая 2018

Изначально я думал просто оставить комментарий, но это требует некоторого объяснения, поэтому я пишу ответ.Вы на самом деле делаете это неправильно.В идеале вы должны передать курсор на 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;
/
0 голосов
/ 28 мая 2018

Это может быть простой способ:

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;  
...