адресация элементов varray в запросе

AnonimousGuest
Дата: 18.11.2008 12:01:10
Есть функция, возвращающая таблицу varray:

create or replace type n4arr as varray(4) of number
/

create or replace type n4t as table of n4arr
/

create or replace function n4f(src_par number) return n4t as
  result_tab n4t := n4t();
  testvar number:=0;
begin
  result_tab.extend(1);
  testvar :=10;
  result_tab(1):=n4arr();
  result_tab(1).extend(4);
  result_tab(1)(1) := 10;
  result_tab(1)(2) := 20;
  result_tab(1)(3) := 30;
  result_tab(1)(4) := 40;
  return result_tab;
end;
/

select f.* from table(n4f(10)) f;

Запрос успешно выполняется, и выводит результат:

(10,20,30,40)

Но мне надо эти значения как-то адресовать, например выбрать 1-й и 3-й элемент.
Можно это сделать в самом запросе?
Jannny
Дата: 18.11.2008 12:58:23
Если забыть, что порядок не гарантирован, то:
select column_value 
from (select column_value, rownum rn from table(select column_value from table(n4f(10)))) 
where rn in (1,3)
А вообще нужно поле, идентифицирующее порядок, потому как к индексу массива не обратиться (насколько я знаю)
AnonimousGuest
Дата: 18.11.2008 13:48:48
Ясно, благодарю!
Как я понял, средний запрос обращается к объекту varray как к таблице?

select column_value 
from (
    select column_value, rownum rn 
    from table(
        select column_value from table(n4f(10))
        )
    ) 
where rn in (1,3)
AnonimousGuest
Дата: 18.11.2008 14:14:52
А нельзя извлечь эти значения в одной строке?
Jannny
Дата: 18.11.2008 15:43:28
AnonimousGuest
А нельзя извлечь эти значения в одной строке?
А что мешает предусмотреть, например, параметр в функции?
AnonimousGuest
Дата: 18.11.2008 15:52:21
Мне надо извлечь сформированный функцией массив как строку (размер массива фиксирован)
Это надо чтобы друга программа могла найти полученные данные. Задать параметр функции наверно можно, но в этом случае наверно придётся её 4 раза вызывать, что не хотелось бы
AnonimousGuest
Дата: 18.11.2008 15:55:05
этот вызов будет использован как часть другого запроса: функции будут переданы параметры, она заполнит массив, который надо вставить как столбцы в ту же строку
AnonimousGuest
Дата: 18.11.2008 15:59:26
Хотелось бы сделать что-то вроде этого

select (1-й элемент) as a1, (2-й элемент) as a2, (3-й элемент) as a3, (4-й элемент) as a4 from (здесь возвращается varray)
Jannny
Дата: 18.11.2008 16:08:53
Ну ничего не мешает поиздеваться над уже приведенным вариантом (все с тем же ограничением, что надо вводить поле, определяющее порядок, либо считать, что порядок не критически важен):
with t as (select column_value, rownum rn from table(select column_value from table(n4f(10))))
select (select column_value from t where t.rn = 1) a1, (select column_value from t where t.rn = 2) a2 ...
from dual
Rust Winter
Дата: 18.11.2008 16:15:24
На правах шутки..

with t as 
( select /*+ MATERIALIZE*/ ora_hash(f.column_value) hsh, row_number() over(partition by ora_hash(f.column_value) order by rownum) rn,
         g.column_value val
    from table(n4f(10)) f, table(f.column_value) g
)
select max(decode(rn, 1, val)) x1,
       max(decode(rn, 2, val)) x2,
       max(decode(rn, 3, val)) x3,
       max(decode(rn, 4, val)) x4
       from t
      group by hsh

без хинта у меня ora-600.