CftClub.ru
Клуб специалистов ЦФТ-Банк

как инициализировать массив

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих
Предыдущая тема :: Следующая тема  
Автор Сообщение
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;

У меня всё работает!
Что я делаю не так?!
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru