Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
vorobey Участник
Вступление в Клуб: 25.06.2019
|
Вт Окт 29, 2019 13:13  как инициализировать массив |
|
Полезность: Нет оценки
|
Здравствуйте.
Подскажите, пожалуйста, как инициализировать массив arrAF1
Без инициализации строки
Код: |
if arrAF1.count = 0 then
arrAF1(arrAF1.first) := i;
|
отказываются работать
Пробовал init по всякому, ни как ни работает.
Нашёл главу 1.2.13.16.1. Модификатор %init.
но чего то не понял.
Код: |
function func1(idQ integer, dateStart date, dateEnd date)
return number is
type arrAcFin is table of [AC_FIN];
arrAF1 arrAcFin;
begin
debug_pipe('func1', 0);
--arrAF1%init;
--arrAF1%init(true,true);
--arrAF1.extend;
--arrAF1%insert(null);
var res number(2) := 0;
for i in ::[AC_FIN] where i.[CLIENT_V]%id = idQ
loop
debug_pipe('id = '||i.[CLIENT_V]%id||' INN = '||i.[CLIENT_V].[INN]||' MAIN_V_ID = '||i.[MAIN_V_ID], 0);
if arrAF1.count = 0 then
arrAF1(arrAF1.first) := i;
else
arrAF1(arrAF1.last + 1) := i;
end if;
end loop;
for i in arrAF1.first..arrAF1.last
loop
debug_pipe('ARRAY arrAF1 - '||arrAF1(i).[CLIENT_V].[INN]||' MAIN_V_ID = '||arrAF1(i).[MAIN_V_ID], 0);
end loop;
debug_pipe('func1____END res = '||res, 0);
return res;
end;
|
|
|
 |
Trei Участник со стажем
Вступление в Клуб: 11.08.2013
|
Вт Окт 29, 2019 13:40  Re: как инициализировать массив |
|
Полезность: Нет оценки
|
vorobey пишет: |
Код: |
for i in ::[AC_FIN] where i.[CLIENT_V]%id = idQ
loop
debug_pipe('id = '||i.[CLIENT_V]%id||' INN = '||i.[CLIENT_V].[INN]||' MAIN_V_ID = '||i.[MAIN_V_ID], 0);
if arrAF1.count = 0 then
arrAF1(arrAF1.first) := i;
else
arrAF1(arrAF1.last + 1) := i;
end if;
end loop;
|
|
У вас в примере pl/sql таблица. Работать с ней можно к примеру вот так:
Код: |
v_idx number;
...
v_idx := arrAF1.count + 1;
arrAF1(v_idx) := i;
|
|
|
 |
vorobey Участник
Вступление в Клуб: 25.06.2019
|
Вт Окт 29, 2019 14:01   |
|
Полезность: Нет оценки
|
Да, так можно работать, но на строке
Код: | v_idx := arrAF1.count + 1; |
Навигатор выводит: "Ссылка на неинициализированный набор"
Нужно как то инициализировать arrAF1. Кое что из документации попробовал что нашёл и что понял. Ни чего не сработало.
Может можно как то добавить первую пустую запись?
insert не сработал. |
|
 |
Volod Эксперт
Вступление в Клуб: 19.09.2007
|
Вт Окт 29, 2019 17:34   |
|
Полезность: Нет оценки
|
А цель использования массива arrAF1 какая?
arrAF1 имеет структуру таблицы AC_FIN, а вы пытаетесь присвоить этой структуре число i
Тогда уж пишите
type arrAcFin is table of ref [AC_FIN]; |
|
 |
Эмиралька Эксперт
Вступление в Клуб: 09.11.2015
|
Чт Окт 31, 2019 12:17   |
|
Полезность: Нет оценки
|
vorobey пишет: | Да, так можно работать, но на строке
Код: | v_idx := arrAF1.count + 1; |
Навигатор выводит: "Ссылка на неинициализированный набор"
Нужно как то инициализировать arrAF1. Кое что из документации попробовал что нашёл и что понял. Ни чего не сработало.
Может можно как то добавить первую пустую запись?
insert не сработал. |
Посмотрите, как объявлен тип arrAcFin в pl/sql-коде.
Если type ... is table of ... index by binary_integer - то это pl/sql-ный массив, который не требует инициализации. |
|
 |
Матвеев Евгений Профи
Вступление в Клуб: 31.01.2012
|
Чт Окт 31, 2019 14:15  Re: как инициализировать массив |
|
Полезность: Нет оценки
|
vorobey пишет: | Здравствуйте.
Подскажите, пожалуйста, как инициализировать массив arrAF1
Код: |
type arrAcFin is table of [AC_FIN];
arrAF1 arrAcFin;
begin
end;
|
|
а так попробовать? не?
Код: |
type arrAcFin is table of ref [AC_FIN];
|
Вполне рабочий код)
Код: |
declare
type arrAcFin is table of ref [AC_FIN];
arrAF1 arrAcFin;
row_count number := 1;
begin
for i in ::[AC_FIN] all loop
if row_count > 50 then
exit;
end if;
arrAF1(row_count) := i;
debug(arrAF1(row_count),0);
row_count := row_count + 1;
end loop;
end;
|
|
|
 |
Эмиралька Эксперт
Вступление в Клуб: 09.11.2015
|
Пт Ноя 01, 2019 09:52  Re: как инициализировать массив |
|
Полезность: Нет оценки
|
Матвеев Евгений пишет: | Вполне рабочий код)
Код: |
declare
type arrAcFin is table of ref [AC_FIN];
arrAF1 arrAcFin;
row_count number := 1;
begin
for i in ::[AC_FIN] all loop
if row_count > 50 then
exit;
end if;
arrAF1(row_count) := i;
debug(arrAF1(row_count),0);
row_count := row_count + 1;
end loop;
end;
|
|
Можно проще...
Код: |
declare
type arrAcFin is table of ref [AC_FIN];
arrAF1 arrAcFin;
begin
for i in ::[AC_FIN] all where rownum <= 50 loop
arrAF1(arrAF1.count+1) := i;
debug(arrAF1(row_count),0);
end loop;
end;
|
|
|
 |
Матвеев Евгений Профи
Вступление в Клуб: 31.01.2012
|
Пт Ноя 01, 2019 09:55   |
|
Полезность: Нет оценки
|
Да я так уж, на коленке прикрутил), чтобы суть понять, ... дело заключалось в ref, но ок, спс) |
|
 |
vorobey Участник
Вступление в Клуб: 25.06.2019
|
Пт Ноя 01, 2019 10:21   |
|
Полезность: Нет оценки
|
Мне ref не помог.
В итоге мне подсказали сделать так:
Код: |
type myRecord is record(
indx number,
acFin [AC_FIN_REF],
ClientName [NAME]
);
type arrAcFin is table of myRecord;
arrAF1 arrAcFin;
|
Так вроде заработало. |
|
 |
Матвеев Евгений Профи
Вступление в Клуб: 31.01.2012
|
Пт Ноя 01, 2019 10:30   |
|
Полезность: Нет оценки
|
vorobey пишет: | Мне ref не помог.
В итоге мне подсказали сделать так:
Код: |
type myRecord is record(
indx number,
acFin [AC_FIN_REF],
ClientName [NAME]
);
type arrAcFin is table of myRecord;
arrAF1 arrAcFin;
|
Так вроде заработало. |
C ref у тебя и тот, начальный вариант заработал бы, из первого поста...
Код: |
for i in ::[AC_FIN] where i.[CLIENT_V]%id = idQ
loop
debug_pipe('id = '||i.[CLIENT_V]%id||' INN = '||i.[CLIENT_V].[INN]||' MAIN_V_ID = '||i.[MAIN_V_ID], 0);
if arrAF1.count = 0 then
arrAF1(arrAF1.first) := i;
else
arrAF1(arrAF1.last + 1) := i;
end if;
end loop;
|
В принципе без разницы как оно там реализовано), и так, и так можно...
просто причину ошибки понять |
|
 |
Volod Эксперт
Вступление в Клуб: 19.09.2007
|
Пт Ноя 01, 2019 12:47   |
|
Полезность: Нет оценки
|
Тогда уж
Код: | bulk collect into v_acc_ref_tbl; |
|
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
Пт Ноя 01, 2019 18:53   |
|
Полезность: Нет оценки
|
В чистом Pl/sql невозможно создать без create type объектного коллекцию записей из нескольких колонок, так ?
только table of number или varray of number
например.
Попытка с Table of rec где rec из более 1 переменной не взлетает.
Пытался тут скрипт замутить . . |
|
 |
Эмиралька Эксперт
Вступление в Клуб: 09.11.2015
|
Вт Ноя 05, 2019 14:14   |
|
Полезность: Нет оценки
|
vorobey пишет: | Мне ref не помог... |
Ничего не понимаю.
Код: |
public procedure test is
type x_arr is table of [AC_FIN];
x x_arr;
r ref [AC_FIN];
begin
select a(a) in ::[AC_FIN] where rownum = 1 into r;
x(1) := r;
dbms_output.put_line('x(1).[MAIN_V_ID] = '||x(1).[MAIN_V_ID]);
end; |
У меня всё работает!
Что я делаю не так?! |
|
 |
|