Разобрать varchar2 в таблицу (Oracle)

Есть ли в Oracle DB 11g r2 встроенная функция, которая может преобразовать переменную varchar2 в таблицу? Напротив listagg или wm_concat. Я нашел только метод Тома Кайта от 2006 года:

with data as
(
select trim(substr (txt, instr(txt, ',', 1, level) + 1
       , instr(txt, ',', 1, level + 1) - instr(txt, ',', 1, level) - 1)) as token
from (select ',' || :txt || ',' txt from dual)
connect by level <= length(:txt) - length(replace(:txt, ',', '')) + 1
)
select * from data;

Я думаю, что у Oracle должен быть более простой способ.


person sergdenisov    schedule 10.07.2013    source источник
comment
возможный дубликат Oracle LISTAGG() для запроса использования   -  person Ben    schedule 11.07.2013


Ответы (2)


No.

Я бы немного упростил метод Тома, но не сильно; теперь вы также можете использовать регулярные выражения:

select regexp_substr(:txt, '[^,]+', 1, level)
   from dual
 connect by regexp_substr(:txt, '[^,]+', 1, level) is not null

скрипт SQL

person Ben    schedule 10.07.2013

Решение Бена regexp_substr обычно является предпочтительным решением. Если ваша строка состоит из строк, которые являются действительными идентификаторами Oracle — они меньше или равны 30 символам и начинаются с буквенного символа, вы также можете использовать dbms_utility.comma_to_table функция. Однако с учетом этих ограничений обычно лучше использовать универсальное решение.

SQL> ed
Wrote file afiedt.buf

  1  declare
  2    l_string varchar2(1000) := 'foo,bar,b123,FuzzyBunny,abcdefghij12345678901234567890';
  3    l_num    pls_integer;
  4    l_arr    dbms_utility.uncl_array;
  5  begin
  6    dbms_utility.comma_to_table( l_string, l_num, l_arr );
  7    for i in 1..l_arr.count
  8    loop
  9      dbms_output.put_line( l_arr(i) );
 10    end loop;
 11* end;
SQL> /
foo
bar
b123
FuzzyBunny
abcdefghij12345678901234567890

PL/SQL procedure successfully completed.
person Justin Cave    schedule 10.07.2013