powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Fetch bulk collect одного поля курсора
4 сообщений из 4, страница 1 из 1
Fetch bulk collect одного поля курсора
    #39642850
brzl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такое выдает ошибку:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
declare
cursor cur is
     select level lvl, level+2 lvl2
       from dual
    connect by level < 3;
type t is table of number;
l t;   
begin

 open cur;
 
 fetch cur.lvl bulk collect into l;
 
 close cur;   
   
 dbms_output.put_line(l.count ||' '|| l.first);

end; 



Заполнить получается только конструкцией:

Код: plsql
1.
2.
3.
4.
 for r in cur loop
     l.extend;
     l(l.count) := r.lvl;
 end loop;   



хочется bulk collect

Предыстория: Есть определенный курсор с кучей полей, который используется в разных местах пакета, но в некоторых нужно выбрать только 1 поле.
Oracle 12.1
...
Рейтинг: 0 / 0
Fetch bulk collect одного поля курсора
    #39642854
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
table of cur%rowtype не поможет?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare
cursor cur is
     select level lvl, level+2 lvl2
       from dual
    connect by level < 3;
type t is table of cur%rowtype;
l t;
begin
 open cur;
 fetch cur bulk collect into l;
 close cur;   
 dbms_output.put_line(l.count ||' '|| l.first);
end; 
...
Рейтинг: 0 / 0
Fetch bulk collect одного поля курсора
    #39642878
brzl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MazoHisttable of cur%rowtype не поможет?

записи могут быть очень толстыми. При определенном количестве могут сожрать большое кол-во памяти.
...
Рейтинг: 0 / 0
Fetch bulk collect одного поля курсора
    #39642889
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не стоит усложнять без необходимости.
Забейте на bulk collect, тем более без кляузы limit.
На современных версиях обычный курсорный for-loop при втором уровне оптимизации делает внутри себя блочную обработку а-ля bulk collect limit 100.
Т.е. делайте
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
declare
  cursor cur is
     select level lvl, level+2 lvl2
       from dual
    connect by level < 100;
    l_cnt pls_integer := 0;
    l_firstVal  pls_integer;
    l_lastVal  pls_integer;
begin
  for i in cur loop
    l_cnt := l_cnt + 1;
    l_lastVal := i.lvl; 
    if l_cnt = 1 then l_firstVal := i.lvl; end if;
  end loop;
 dbms_output.put_line('total: '||l_cnt ||', first='|| l_firstVal||', last='||l_lastVal);
end; 


и все будет хорошо.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Fetch bulk collect одного поля курсора
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]