Как я могу вернуть строку CSV из типа таблицы PL/SQL в Oracle

Я определил переменную PL/SQL табличного типа и добавил туда некоторые данные.

create or replace type varTableType as table of varchar2(32767);
my_table varTableType := varTableType()
...
my_table := some_function();

Теперь у меня есть эта переменная типа таблицы my_table с несколькими тысячами записей. Мне нужно выбрать только те записи, которые заканчиваются определенным символом, например 'a', и получить результаты в виде строки, разделенной запятыми. Я думаю, что функция COLLECT может это сделать, но я не понимаю, как именно. Я использую Oracle 10g.


person shpokas    schedule 12.06.2012    source источник


Ответы (2)


Не вдаваясь в вопрос, почему вы используете тип таблицы, а не таблицу (или временную таблицу), вы можете сделать это так:

declare
  my_table varTableType;
  i varchar2(32767);
begin
  my_table := new
              varTableType('bbbb', 'ccca', 'ddda', 'eee', 'fffa', 'gggg');

  select trim(xmlagg(xmlelement(e, column_value || ','))
              .extract('//text()'))
    into i
    from table(my_table)
   where column_value like '%a';

  dbms_output.put_line(i);

end;

Есть и другие способы объединения строк: WM_CONCAT (если включено) или LISTAGG (начиная с 11g R2), но основная идея

select column_value 
from table(my_table) 
where column_value like '%a';

остается


Есть еще способ без sql:

declare
  my_table varTableType;
  i varchar2(32767);
begin
  my_table := new
              varTableType('bbbb', 'ccca', 'ddda', 'eee', 'fffa', 'gggg');

  FOR j IN my_table.first .. my_table.last LOOP

     IF my_table(j) like '%a' THEN
        i := i || my_table(j);
     END IF;

  END LOOP;

  dbms_output.put_line(i);

end;
person A.B.Cade    schedule 12.06.2012
comment
Спасибо, ваши примеры полностью удовлетворили мои потребности. Как-то я растерялся и подумал, что искомое решение будет более сложным. - person shpokas; 13.06.2012

В этом сообщении в блоге Тима Холла приведены способы сделать это, в зависимости от версии Oracle.

person DCookie    schedule 12.06.2012