вынести запрос из цикла

wankel
Дата: 22.03.2011 15:20:14
Добрый!

Есть процедура расчета некоторых статистических параметров. конструкция примерно вот такая
declare
  b number;
  CURSOR cur is
  select * from t;
begin
  for c in cur loop
     select sum(b) into и
       from t1
     where t1.c1=c.c1
       and t1.c2=c.c2;
     --...
  end loop;
end;
/ 

select в цикле выполняется очень медленно. Задача - вынести select за рамки цикла и выполнять его один раз, а потом полученную выборку соединять с вышеобъявленным курсором внутри цикла. Подскажите как правильнее это реализовать?
SQLap
Дата: 22.03.2011 15:26:07
wankel,

а что , join t1 и t (c group by'ем) не катит, что ли? /*Без курсоров*/
env
Дата: 22.03.2011 15:28:55
wankel,

select t.c1, t.c2, sum(b) sm 
from t1, t
where t1.c1(+)=t.c1 and t1.c2(+)=t.c2
group by t.c1,t.c2
select t.*, (select sum(b) from t1 where t1.c1=t.c1 and t1.c2=t.c2) sm
from t

Что ещё делается внутри цикла? М.б. всю логику можно спокойно внести в один запрос.
wankel
Дата: 22.03.2011 15:42:35
SQLap
а что , join t1 и t (c group by'ем) не катит, что ли? /*Без курсоров*/


env
М.б. всю логику можно спокойно внести в один запрос.


там не все так просто как я напсал. в процедуре куча расчетов, и запросы тоже не такие простые.
Я хотел бы узнать каким образом можно выполнять запрос один раз, а потом соединяться с полученным результатом.

ну как то так
declare
  b number;
  CURSOR cur is
  select * from t;
begin
-- сохранить полученную выборку кденить в temp1
select t1.c1, t1.c2, sum(b) into и
       from t1
--
  for c in cur loop
     select sum(b) into b
       from temp1
     where temp1.c1=c.c1
       and temp1.c2=c.c2;
     --...
  end loop;
end;
/ 

смотрел в сторону матвью, использовать для внутреней выборки? или это лишнее?
AmKad
Дата: 22.03.2011 15:45:52
wankel
Я хотел бы узнать каким образом можно выполнять запрос один раз

Вроде показали уже.
wankel
-- сохранить полученную выборку кденить в temp1
select t1.c1, t1.c2, sum(b) into и
       from t1

Боюсь такой селегд не пройдет.
wankel
Дата: 22.03.2011 15:49:49
AmKad
wankel
Я хотел бы узнать каким образом можно выполнять запрос один раз

Вроде показали уже.
wankel
-- сохранить полученную выборку кденить в temp1
select t1.c1, t1.c2, sum(b) into и
       from t1

Боюсь такой селегд не пройдет.


group by t1.c1, t1.c2
env
Дата: 22.03.2011 15:58:35
wankel
AmKad
пропущено...

Вроде показали уже.
пропущено...

Боюсь такой селегд не пройдет.


group by t1.c1, t1.c2


можно посмотреть в сторону коллекций и bulk collect

Но, пмм, целесообразность пока под вопросом.
Что мешает сделать объединение и группировку в запросе курсора?

К ранее предложенным вариантам
select t.*,t2.sm
from t,
      (select t1.c1, t1.c2, sum(b) sm from t1 group by t1.c1,t1.c2) t2
where t2.c1(+)=t.c1 and t2.c2(+)=t.c2