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

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

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

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

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

SY.
...
Рейтинг: 0 / 0
14.12.2017, 22:18
    #39569981
leprechaun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение массива
Ой, можно чуть подробнее синтаксис
...
Рейтинг: 0 / 0
14.12.2017, 23:55
    #39570025
SY
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
15.12.2017, 01:05
    #39570041
leprechaun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение массива
Интересно подумаю спасибо

У меня чуть другая ситуация, от -10 до 0 я уже занимаю позиции служебными данными, а с 1 начинаю отсчитывать значения - индекс это порядковый номер колонки. Поэтому хотелось бы чтобы первый массив лег с 0 до N1, а второй за ним с N1 до N2
...
Рейтинг: 0 / 0
15.12.2017, 01:45
    #39570044
SY
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
15.12.2017, 02:30
    #39570059
leprechaun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение массива
о, что-то близко, но еще не понял, утром попробую

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

нужен их порядок в общем массиве начиная с индекса 1 с N1 по N2
извиняюсь за тугость
...
Рейтинг: 0 / 0
15.12.2017, 04:39
    #39570071
SY
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
15.12.2017, 13:24
    #39570290
leprechaun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение массива
Отлично, работает. Благодарю за помощь
...
Рейтинг: 0 / 0
15.12.2017, 14:50
    #39570362
leprechaun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение массива
Единственное, если level <= 0, то одна строка всё равно резервируется. Ну то такое.
...
Рейтинг: 0 / 0
15.12.2017, 15:29
    #39570385
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение массива
leprechaunЕдинственное, если level <= 0, то одна строка всё равно резервируется. Ну то такое.

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

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



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

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


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