3

我正在寻找一个嵌套表,以便我可以使用查询来重新排序值。由于没有键名,我想知道列名是什么?

我知道这不是正确的语法,但它说明了我想要实现的目标。

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;
4

1 回答 1

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 函数的更多信息,请参阅文档

更新:

对于 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
于 2013-12-03T12:39:50.107 回答