10 мая 2009

[Oracle PL/SQL] Преобразование строки в маcсив

Несколько дней назад перед мною стала интересная задача : необходимо список сокращений, представленных в виде строки через запятую, преобразовать в массив.
На ум сразу приходит самое простое но не очень эстетическое решение - написать Pl/Sql процедуру, которая будет выполнять такую задачу.


SQL> CREATE OR REPLACE FUNCTION convert_comma_to_table(p_list IN VARCHAR2)
2 RETURN test_type
3 AS
4 l_string VARCHAR2(32767) := p_list || ',';
5 l_comma_index PLS_INTEGER;
6 l_index PLS_INTEGER := 1;
7 l_tab test_type := test_type();
8 BEGIN
9 LOOP
10 l_comma_index := INSTR(l_string, ',', l_index);
11 EXIT WHEN l_comma_index = 0;
12 l_tab.EXTEND;
13 l_tab(l_tab.COUNT) := SUBSTR(l_string, l_index, l_comma_index - l_index);
14 l_index := l_comma_index + 1;
15 END LOOP;
16 RETURN l_tab;
17 END f_convert;
18 /
Довольно простая функция, которая успешно выполнит поставленную задачу.
Потратив некоторое время на поиски , я натолкнулся на вариант покрасивее. В системном пакете dbms_utility есть функция comma_to_table , которая выполняет аналогичную функциональность. Пример использования :
SQL> DECLARE
2 l_tab dbms_utility.uncl_array;
3 l_tablen number;
4 BEGIN
5 dbms_utility.comma_to_table('A,B,C', l_tablen, l_tab);
6 dbms_output.put_line('TABLE LENGTH : '|| l_tablen);
7 dbms_output.put_line('TABLE COUNT : '|| l_tab.COUNT);
8 for i in 1..l_tablen
9 loop
10 dbms_output.put_line(l_tab(i));
11 end loop;
12 END;
13 /
Замечание! На самом деле эта процедура используется для внутренних целей Oracle, поэтому имеется ряд требований к элементам будущего массива:
- это не должны быть числа, в т.ч. слова начинающиеся на цифры;
- это не должны быть зарезервированные слова;
- это не должны быть строки длиннее 30 символов.
Первые два условия я обошёл добавляя перед каждой запятой спец строку, а после преобразования удаляя её, так что в итоге удалось воспользоватся этой удобной поцедуркой из dbms_utility.

1 комментарий:

Анонимный комментирует...
Этот комментарий был удален администратором блога.