Линеаризовать вложенную таблицу Oracle - PullRequest
1 голос
/ 29 ноября 2010

Как линеаризовать вложенную таблицу, которая сама по себе также содержит вложенные таблицы (примечание: внутренние таблицы могут иметь различный размер). Предположим, у меня есть следующие объявления типов:

CREATE OR REPLACE TYPE VECTOR
IS
  TABLE OF NUMBER;

CREATE OR REPLACE TYPE TABLE_OF_VECTOR
IS
  TABLE OF VECTOR;

И следующий фрагмент PL / SQL:

DECLARE
  number_table TABLE_OF_VECTOR;
  result_vector VECTOR;
BEGIN
  number_table := table_of_vector(vector(23, 4, 2222, 22222222),
    vector(2, 1, 766, 2), vector(2, 1, 5));
END;

Есть ли способ, которым я могу линеаризовать number_table и сохранить все его значения в result_vector как один непрерывный список чисел? Я хочу закончить с:

result_vector == vector(23, 4, 2222, 22222222, 2, 1, 766, 2, 2, 1, 5)

Ответы [ 2 ]

5 голосов
/ 29 ноября 2010

Да, но не красиво.

select cast(collect(b.column_value) as vector) 
from  table(table_of_vector(
             vector(23, 4, 2222, 22222222), 
             vector(2, 1, 766, 2), 
             vector(2, 1, 5))) a, 
      table(a.column_value) b;

Таким образом, часть таблицы (...) обрабатывает table_of_vector как «обычную» таблицу со столбцом с именем «COLUMN_VALUE». Затем мы рассматриваем это как другую таблицу, которую я назвал B.

Выражение SELECTed берет все отдельные числа, которые составляли таблицы «B» в таблице «A», и объединяет их в коллекцию (используя COLLECT). Наконец, я явно приведу коллекцию к типу VECTOR.

1 голос
/ 29 ноября 2010
DECLARE
  number_table TABLE_OF_VECTOR;
  result_vector VECTOR:=vector();
BEGIN
  number_table := table_of_vector(vector(23, 4, 2222, 22222222),
    vector(2, 1, 766, 2), vector(2, 1, 5));
for i in number_table.first .. number_table.last loop
   for  j in number_table(i).first .. number_table(i).last loop
     result_vector.extend();
     result_vector(result_vector.count):=number_table(i)(j);
  end loop;
end loop;
for i in 1.. result_vector.count loop
    dbms_output.put_line(result_vector(i));
end loop;
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...