Как вернуть строку 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
переменная табличного типа с несколькими тысячами записей. Я должен выбрать только те записи, заканчивающиеся определенным символом, сказать "а" и получить результаты в строке через запятую. Я думаю, что функция COLLECT могла бы сделать это, но я не понимаю, как именно. Я использую Oracle 10g.
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;
Посмотрите эту запись в блоге Тима Холла, чтобы узнать, как это сделать, в зависимости от версии Oracle.