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

Есть два ассоциативных массива. Первый заполняется через BULK COLLECT, вторым после этого дополняю первый.
А нужно последовательность поменять, как-то зарезервировать в первом N мест для вставки второго, ну чтобы информация из него была в оказалась в начале.

Чет не соображу как лучше сделать.
...
Рейтинг: 0 / 0
Заполнение массива
    #39569949
leprechaun,

1-N, 2-N,...,N-N
...
Рейтинг: 0 / 0
Заполнение массива
    #39569968
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leprechaun,

BULK COLLECT 1 - N1. Bторым после этого дополняeм первый с индексами -N2+1,...,0.

SY.
...
Рейтинг: 0 / 0
Заполнение массива
    #39569981
leprechaun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ой, можно чуть подробнее синтаксис
...
Рейтинг: 0 / 0
Заполнение массива
    #39570025
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leprechaunОй, можно чуть подробнее синтаксис

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
declare
    type a_type is table of varchar2(10)
     index by pls_integer;
    v_tbl1 a_type;
    v_tbl2 a_type;
begin
    select  ename
      bulk  collect
      into  v_tbl1
      from  emp;
    select  dname
      bulk  collect
      into  v_tbl2
      from dept;
    for v_i in 1..v_tbl2.count loop
      v_tbl1(v_i - v_tbl2.count) := v_tbl2(v_i);
    end loop;
    for v_i in v_tbl1.first..v_tbl1.last loop
      dbms_output.put_line('v_tbl1(' || v_i || ') = ' || v_tbl1(v_i));
    end loop;
end;
/
v_tbl1(-3) = ACCOUNTING
v_tbl1(-2) = RESEARCH
v_tbl1(-1) = SALES
v_tbl1(0) = OPERATIONS
v_tbl1(1) = SMITH
v_tbl1(2) = ALLEN
v_tbl1(3) = WARD
v_tbl1(4) = JONES
v_tbl1(5) = MARTIN
v_tbl1(6) = BLAKE
v_tbl1(7) = CLARK
v_tbl1(8) = SCOTT
v_tbl1(9) = KING
v_tbl1(10) = TURNER
v_tbl1(11) = ADAMS
v_tbl1(12) = JAMES
v_tbl1(13) = FORD
v_tbl1(14) = MILLER

PL/SQL procedure successfully completed.

SQL>



SY.
...
Рейтинг: 0 / 0
Заполнение массива
    #39570041
leprechaun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Интересно подумаю спасибо

У меня чуть другая ситуация, от -10 до 0 я уже занимаю позиции служебными данными, а с 1 начинаю отсчитывать значения - индекс это порядковый номер колонки. Поэтому хотелось бы чтобы первый массив лег с 0 до N1, а второй за ним с N1 до N2
...
Рейтинг: 0 / 0
Заполнение массива
    #39570044
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leprechaun,

Если число элементов N2 известно до заполнения N1:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
WITH T AS (
           SELECT NULL COL,1 WEIGHT FROM DUAL CONNECT BY LEVEL <= N2_ELEMENT_COUNT
           UNION ALL
           SELECT your_select_list,2 WEIGHT FROM rest_of_your_query
          )
SELECT  COL
  BULK  COLLECT
  INTO  N1
  FROM  T
  ORDER BY WEIGHT;



SY.
...
Рейтинг: 0 / 0
Заполнение массива
    #39570059
leprechaun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
о, что-то близко, но еще не понял, утром попробую

у меня N1 это заполненный вручную в цикле массив,
N2 массив того же типа, получаемый селектом BULK COLLECT .

нужен их порядок в общем массиве начиная с индекса 1 с N1 по N2
извиняюсь за тугость
...
Рейтинг: 0 / 0
Заполнение массива
    #39570071
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leprechaunнужен их порядок в общем массиве начиная с индекса 1 с N1 по N2


Поменяй порядок действий (опять таки предполагая число элементов N1 известно зарaнее):

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
WITH T AS (
           SELECT NULL COL,1 WEIGHT FROM DUAL CONNECT BY LEVEL <= N1_ELEMENT_COUNT
           UNION ALL
           SELECT your_select_list,2 WEIGHT FROM rest_of_your_query
          )
SELECT  COL
  BULK  COLLECT
  INTO  N
  FROM  T
  ORDER BY WEIGHT;



Затем вручную в цикле заполняем первые N1 элементов N.

SY.
...
Рейтинг: 0 / 0
Заполнение массива
    #39570290
leprechaun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отлично, работает. Благодарю за помощь
...
Рейтинг: 0 / 0
Заполнение массива
    #39570362
leprechaun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Единственное, если level <= 0, то одна строка всё равно резервируется. Ну то такое.
...
Рейтинг: 0 / 0
Заполнение массива
    #39570385
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leprechaunЕдинственное, если level <= 0, то одна строка всё равно резервируется. Ну то такое.

Естественно. START WITH еще никто не отмeнял (суслик то есть хоть и невидим )

Код: plsql
1.
START WITH N1_ELEMENT_COUNT > 0



SY.
...
Рейтинг: 0 / 0
Заполнение массива
    #39570481
leprechaun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я еще не умею оператор START WITH использовать, спасибо за наводку почитаю.
Пока просто проверку поставил и выполняю одни из запросов в зависимости от N1.

Этот оператор позволит обойтись без неё?
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Заполнение массива
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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