2013-09-19 2 views
3

Я ищу для вставки вложенной таблицы, поэтому я могу использовать запрос для изменения порядка значений. Поскольку нет ключевого имени, мне интересно, как будет выглядеть имя столбца?Oracle вложенная таблица вложенных таблиц и имя ключа значения

Я знаю, что это не правильный синтаксис, но это иллюстрация того, чего я хочу достичь.

CREATE OR REPLACE TYPE a_nested_table AS TABLE OF VARCHAR2(20); 

CREATE OR REPLACE FUNCTION my_func RETURN VARCHAR2 IS 
    output VARCHAR2; 
    list a_nested_table := a_nested_table('foo', 'bar'); 
BEGIN 
    FOR current_record IN( 
     SELECT column_name INTO bar 
     FROM TABLE(CAST(list AS a_nested_table)) 
     ORDER BY UPPER(column_name) ASC 
    ) LOOP 
     output := output || current_record.column_name 
    END LOOP; 

    return output; 
END my_func; 
+2

заказ пунктом с 'column_value' должен сделать трюк, вы попробуете? – Sebas

+0

Вы всегда можете использовать позиционную нотацию, например. ORDER BY 1. Если это помогает мне вести блог о сортировке вложенной таблицы здесь: http://www.oraclefrontovik.com/2013/08/sorting-an-oracle-nested-table/ –

+0

@Sebas Да, column_value работал. @IanCarpenter Я использовал 'FOR current_record IN (/ * select statement * /) LOOP'; насколько это отличается от вашего 'SELECT CAST (MULTISET (/ * select statement * /)) INTO nested_table FROM DUAL' метод? – gawpertron

ответ

2

Если вы версия 11.2 или выше, то вы можете использовать функцию LISTAGG:

create or replace type a_nested_table as table of varchar2(20); 

create or replace function my_func return varchar2 is 
    result varchar2(4000); 
    list a_nested_table := a_nested_table('aa', 'bb', 'cc', 'dd', 'ee'); 
begin 
    select listagg(column_value, ' ') within group(order by column_value desc) 
    into result 
    from table(list); 

    return(result); 
end my_func; 

...

SQL> select my_func from dual; 
MY_FUNC 
-------------------------------------------------------------------------------- 
ee dd cc bb aa 

Для получения дополнительной информации об использовании функции LISTAGG см documentation.

UPDATE:

Для версии 10g:

create or replace type a_nested_table is table of varchar(20); 

create or replace function my_func return varchar2 is 
    list a_nested_table := a_nested_table('aa', 'bb', 'cc', 'dd', 'ee'); 
    result varchar2(4000); 
begin 
    for c1 in (select column_value col_val from table(list) order by 1 desc) loop 
    result := result || ' ' || c1.col_val; 
    end loop; 
    return result; 
end my_func; 

SQL> select my_func from dual; 
MY_FUNC 
-------------------------------------------------------------------------------- 
ee dd cc bb aa 
+0

Я не это 10. Обнаружено, что использование таблиц имеет верхний предел и вызывает ошибки – gawpertron

+0

Какие ошибки? Пожалуйста, публикуйте точные сообщения об ошибках. –

Смежные вопросы