Как динамическое расширить массив

racer
Дата: 21.02.2007 13:07:51
Всем привет.
Вопрос: как динамически рассширить массив на нужное количество строк ???



Не ошибается тот кто ничего не делает
Brodiaga
Дата: 21.02.2007 13:09:03
Что за массив то?
Brodiaga
Дата: 21.02.2007 13:11:44
Если ты имеешь в виду коллекции, то они сами расширяются!
racer
Дата: 21.02.2007 13:14:41
type tFactRecord is record(
поле1 number,
поле2 varchar2(20),
поле3 varchar2(3));
type tFact is table of tFactRecord;
cFact tFact := tFact();

это объявление массива


for q in (select * from table1 t) loop
z := z + 1;
cFact.extend;
cFact.extend;
cFact.extend;
cFact.extend;
cFact.extend;
select q.поле1, q.поле2, q.поле3
into cfact(z) .nquant, cfact(z) .smodifcode, cfact(z) .scode
from dual;
end loop
вот так я в него записываю
extend 5 раз потому что я точно знаю что 5 строк вернет запрос.
а щас не знаю сколько строк вернет запрос поэтому необходимо динамически расширять массив



Не ошибается тот кто ничего не делает
Oleg Afanasiev
Дата: 21.02.2007 13:15:17
Brodiaga
они сами расширяются!

Сами только кошки родятся :)
а коллекциям нужно делать .extend
mcureenab
Дата: 21.02.2007 13:23:55
racer
type tFactRecord is record(
...


Батва. Сам то понял, что написал?
Какой запрос 5 строк возвращает, from dual? И нафиг 5 extend, когда используется только один - z?

Если нужна выборка массивом, используй select ... bulk collect into ...
maksim2020
Дата: 21.02.2007 13:25:08
racer
type tFactRecord is record(
поле1 number,
поле2 varchar2(20),
поле3 varchar2(3));
type tFact is table of tFactRecord;
cFact tFact := tFact();

это объявление массива


for q in (select * from table1 t) loop
z := z + 1;
cFact.extend;
cFact.extend;
cFact.extend;
cFact.extend;
cFact.extend;
select q.поле1, q.поле2, q.поле3
into cfact(z) .nquant, cfact(z) .smodifcode, cfact(z) .scode
from dual;
end loop
вот так я в него записываю
extend 5 раз потому что я точно знаю что 5 строк вернет запрос.
а щас не знаю сколько строк вернет запрос поэтому необходимо динамически расширять массив



Не ошибается тот кто ничего не делает


Во-первых, достаточно сделать cFact.extend(5);, во-вторых, можно cделать примерно вот так:

cursor a is select * from table1;

type t_a is table of a%rowtype;
type t_b is table of sometable%rowtype;
...
la t_a := t_a();
lb t_b := t_b();
...
open a;
fetch a bulk collect into la; -- limit xxx
lb.extend(la.count);
...
close a;
...
racer
Дата: 21.02.2007 13:28:03
mcureenab

Какой запрос 5 строк возвращает, from dual?


вообщето 5 строк возвращает select * from table1 а не from dual
Brodiaga
Дата: 21.02.2007 13:47:34
Oleg Afanasiev
Brodiaga
они сами расширяются!

Сами только кошки родятся :)
а коллекциям нужно делать .extend



АГА!АГА!
Если вам известно коллекции бывают трех видов:
1) Ассоциативные массивы
2) Вложенные таблицы
3) Массивы Varray!

Для вложенных таблиц - действительно нужен extend, но для ассоциативных массивов ненужно!!
Пример

declare
type list_1 is table of date;
type list_2 is table of number index by binary_integer;
--
v_list list_1 := list_1();
V_list_2 list_2;
begin
v_list.extend;
v_list(1):= '23-SEP-2007';
V_list_2(100) := 1;
end;
--
Так что это не кошки!
mcureenab
Дата: 21.02.2007 13:53:09
racer
mcureenab

Какой запрос 5 строк возвращает, from dual?


вообщето 5 строк возвращает select * from table1 а не from dual


Ну и за каким фигом ты пять раз добавляешь по пять строк?