powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / добавление нового элемента в коллекцию
25 сообщений из 25, страница 1 из 1
добавление нового элемента в коллекцию
    #39548424
boris_borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет
подскажите пожалуйста такая ситуация:

есть переменная mod_accounts numb_array;

а тип numb_array уже:
CREATE TYPE numb_array IS TABLE OF pair_number;

а вот уже pair_number:
CREATE OR REPLACE TYPE pair_number AS OBJECT
(
i NUMBER,
j NUMBER
)

И мне нужно добавить новый элемент в эту коллекцию:

begin
--Для начала я её инициализировал:
mod_accounts:=numb_array(pair_number(1,1));

--потом посмотрел кол-во элементов в коллекции:
DBMS_OUTPUT.PUT_LINE(mod_accounts.count);

--И он мне вывел - 1;
--Затем мне нужно добавить новый элемент в эту коллекцию, и я делаю так:
mod_accounts.extend(1);

--после чего хочу присвоить значения вторым элементам коллекции:
mod_accounts(2).i:=2;
mod_accounts(2).j:=2;

end;

и он мне пишет - Ссылка на неинициализированный составной тип строка такая-то

Про все про это прочитал тут - https://habrahabr.ru/post/254355/
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548426
boris_borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как мн сделать так что бы в этой коллекции было что-то вроде:
1) 1,1
2) 2,2
3) 3,3
... и т.д. ?
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548486
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
boris_borisych
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
begin
--Для начала я её инициализировал:
mod_accounts:=numb_array(pair_number(1,1));

--потом посмотрел кол-во элементов в коллекции:
DBMS_OUTPUT.PUT_LINE(mod_accounts.count);

--И он мне вывел - 1;
--Затем мне нужно добавить новый элемент в эту коллекцию, и я делаю так:
mod_accounts.extend(1);
mod_accounts(mod_accounts.count) = pair_number(2,2);
--после чего хочу присвоить значения вторым элементам коллекции:
mod_accounts(2).i:=2;
mod_accounts(2).j:=2;

end;
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548497
boris_borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender,

Благодарю, скажите, а почему так? Это конструктор что ли такой для неё?
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548502
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
boris_borisych,

у тебя коллекция объектов , т.е. помимо инициализации самой коллекции, надо еще инициализировать и каждый объект
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548706
boris_borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtenderboris_borisych,

у тебя коллекция объектов , т.е. помимо инициализации самой коллекции, надо еще инициализировать и каждый объект

Да, помогло, благодарю
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548721
boris_borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtenderboris_borisych,

у тебя коллекция объектов , т.е. помимо инициализации самой коллекции, надо еще инициализировать и каждый объект

Почему-то то же самое в цикле не работает

declare i pls_integer;
begin
for i in 1..3 loop
mod_accounts:=numb_array(pair_number(i,i));
mod_accounts(i).i:=i;
mod_accounts(i).j:=i;
DBMS_OUTPUT.PUT_LINE(mod_accounts(i).i || ' - ' || to_char(i));
DBMS_OUTPUT.PUT_LINE(mod_accounts(i).j || ' - ' || to_char(i));
mod_accounts.extend(1);
end loop;
end;

При присвоении i-го значения выводит строку - Индекс выходит за преелы счетчика массива

Пробовал по разному:
сначала добавить элемент, потом присвоить, так же пробовал инициализировать, добавить, инициализировать, присвоить, все равно выодит ошибка - Индекс выходит за преелы счетчика массива
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548724
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boris_borisych
Код: plsql
1.
2.
for i in 1..3 loop
      mod_accounts:=numb_array(pair_number(i,i));

Не быть тебе программистом.
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548727
boris_borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elicboris_borisych
Код: plsql
1.
2.
for i in 1..3 loop
      mod_accounts:=numb_array(pair_number(i,i));

Не быть тебе программистом.
т.е. по сути в момент инициализации... а почему тогда потом просто присваивание не срабатывает?
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548735
boris_borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

скажите, а почему тогда при выполнении такого кода:

for i in 1..3 loop
mod_accounts:=numb_array(pair_number(i,i));
DBMS_OUTPUT.PUT_LINE(mod_accounts(i).j || ' - ' || to_char(j));
end loop;

он ругается - Индекс выходит за пределы счетчика массива
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548750
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boris_borisychа почему тогдаОтветь себе на простые вопросы: сколько элементов в коллекции и как это количество меняется на протяжении цикла.
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548755
boris_borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elicboris_borisychа почему тогдаОтветь себе на простые вопросы: сколько элементов в коллекции и как это количество меняется на протяжении цикла.

Точно, понял уже, сделал так:

for i in 1..3 loop
mod_accounts:=numb_array(pair_number(i,i));
mod_accounts.extend(i);
DBMS_OUTPUT.PUT_LINE (to_char(mod_accounts(i).key) || ' - ' || to_char(i) );
end loop;

Но теперь столкнулся с вопросом, почему элементы 2-а и 3-и пустые?
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548817
boris_borisychНо теперьНеужели так сложно сдерживать себя и не выплескивать каждое проявление тупости на всеобщее обозрение. Сядь. Прочти книжку. Целиком. До конца. Три раза. Потом задавай вопросы.
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548835
boris_borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
жертва соцсетей,

Пожалуйста по делу
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548854
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boris_borisych,

присмотритесь к такой строчке

mod_accounts numb_array :=numb_array(pair_number(1,2),pair_number(3,4),pair_number(5,6));

и все у Вас получится

.....
stax
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548866
boris_borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Staxboris_borisych,

присмотритесь к такой строчке

mod_accounts numb_array :=numb_array(pair_number(1,2),pair_number(3,4),pair_number(5,6));

и все у Вас получится

.....
stax

Ну да, я понял, что эта инициализация сразу на все элементы массива, а как сделать такую штку в цикле?
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548871
boris_borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

спасибо Вам большое, получилось в цикле, только такой ещё момент - а если я не знаю сколько изначально может быть элементов в массиве?
Например сейчас это 3-и, а завтра уже 150, если я буду каждый раз делать на 150 элементов, то это будет пустой тратой памяти, как можно поступить в этом плане?
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548883
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boris_borisychStaxboris_borisych,

присмотритесь к такой строчке

mod_accounts numb_array :=numb_array(pair_number(1,2),pair_number(3,4),pair_number(5,6));

и все у Вас получится

.....
stax

Ну да, я понял, что эта инициализация сразу на все элементы массива, а как сделать такую штку в цикле?

не поняли, но то не важно

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL> ed
Wrote file afiedt.buf

  1  declare
  2    mod_accounts numb_array;
  3  begin
  4    mod_accounts:=numb_array();
  5    for i in 1..3 loop
  6     mod_accounts.extend;
  7     mod_accounts(i):=pair_number(i,i);
  8     DBMS_OUTPUT.PUT_LINE(mod_accounts(i).j);
  9    end loop;
 10* end;
SQL> /
1
2
3

PL/SQL procedure successfully completed.



....
stax
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548890
boris_borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Спасибо Вам большое, я делал немного по другому, в declare инициализировал, потом в теле проги уже присваивал. Поэтому и возник вопрос, что делать если размер массива не определён
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548905
boris_borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

почему-то стала возникать ошибка - expression is wrong type

скопировал ваш код, выполнил на скрипте - норм, в пакете - ошибка
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548907
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boris_borisych в declare инициализировал, потом в теле проги уже присваивал. Поэтому и возник вопрос
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare
  mod_accounts :=numb_array(); -- Инициализируем МАССИВ
begin
  for i in 1..3 loop
   mod_accounts.extend; -- добавляем в массив элемент. Не инициализированный пока.
   mod_accounts(i):=pair_number(i,i); -- инициализируем ЭЛЕМЕНТ массива (конструируем объект типа pair_number)
   DBMS_OUTPUT.PUT_LINE(mod_accounts(i).j);
  end loop;
end;
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548911
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boris_borisychвыполнил на скрипте - норм, в пакете - ошибка
Ошибка в 17 строке.
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548966
boris_borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

я все понимаю, но все равно пишет что тип неправильный, у индекса элементов коллекции тип ведь number, да ? Я же правильно прочитал про тэто?
А если там тип number, то блин почему он тогда ругается?
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39548976
boris_borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
все ок, тип был неправильный
...
Рейтинг: 0 / 0
добавление нового элемента в коллекцию
    #39549334
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boris_borisychспасибо Вам большое, получилось в цикле, только такой ещё момент - а если я не знаю сколько изначально может быть элементов в массиве?
Например сейчас это 3-и, а завтра уже 150, если я буду каждый раз делать на 150 элементов, то это будет пустой тратой памяти, как можно поступить в этом плане?Не боись. Тупой код всё равно хуже стать не сможет.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / добавление нового элемента в коллекцию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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