как использовать массовый сбор вместо цикла в Oracle - PullRequest
1 голос
/ 01 июля 2010

У меня есть пример запроса, как показано ниже в моей процедуре:

result_rec              mypkg.mytype;

OPEN CUR1 FOR
  select col1, col2, col3 from table1 where something = 'a'; --rows will always be 50

      LOOP
         FETCH CUR1
          INTO myrectype;
         EXIT WHEN CUR1%NOTFOUND;
         result_rec.col1 := myrectype.col1;
         result_rec.col2 := myrectype.col2;
         result_rec.col3 := myrectype.col3;
         PIPE ROW (result_rec);
      END LOOP;

Как видите, каждый раз, когда я зацикливаюсь 50 разЕсть лучший способ сделать это?что-то вроде BULK COLLECT INTO?как бы это реализовать?

Ответы [ 2 ]

6 голосов
/ 01 июля 2010

В Oracle 10g (возможно, 9i) Oracle автоматически собирает неявные курсоры.Так что код наподобие:

DECLARE
  result_rec              mypkg.mytype;
BEGIN
  for i in (select col1, co2, col3 from table1 where something = 'a')
  loop
    result_rec.col1 := i.col1;
    result_rec.col2 := i.col2;
    result_rec.col3 := i.col3;
    pipe_row (result_rec);
  end loop;
END;

Переключение контекста с механизма PL / SQL на механизм SQL будет выполняться только для механизма выборки записей каждые 100 строкЗапустите его под трассировкой SQL (dbms_monitor.session_trace_enable()) и посмотрите!

3 голосов
/ 01 июля 2010

Вы можете попробовать следующее.

DECLARE
  type tab_result_rec IS TABLE OF mypkg.mytype INDEX BY PLS_INTEGER;
  t_result_rec tab_result_rec;
BEGIN
  select col1, col2, col3 bulk collect into t_result_rec
  from table1 where something = 'a'; --rows will always be 50
  --
  for i in 1..t_result_rec.count LOOP
     PIPE ROW (t_result_rec(i));
  end loop;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...