| Предыдущая тема :: Следующая тема | 
	
	
		| Автор | Сообщение | 
	
		| 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;
 | 
 У меня всё работает!
 Что я делаю не так?!
 |  | 
	
		|  | 
	
		|  |