Гость
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Преобразование LOV в список строк (SPLIT) / 7 сообщений из 7, страница 1 из 1
06.10.2011, 17:17
    #37471388
Oleg Petrochenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование LOV в список строк (SPLIT)
Добрый день, уважаемые!

История такова:

Есть база данных заявок.
Эту базу пользователи хотят видеть в разном режиме фильтрации, согласно статусу заявки.

Единственное, что приходит в голову, фильтровать строки прямо в SQL запросе
Код: plaintext
1.
2.
3.
4.
5.
6.
select tck_id, tck_text, status_display
from tck_result
where status_display in
  (select column_value 
    from table( split(:P2_X_FILTER) )
  )

tck_result - это вьюшка, обновляемая при внесении изменений в базу.

:P2_X_FILTER - собственно фильтр в котором пользователь задает (ставит галки) на статусы сообщений которые хочет видеть. Значение фильтра выглядит примерно так:
NEW:INPROGRESS:WAIT

split - самописная функция, которая режет строку на подстроки по двоеточию.

Собственно все бы ничего, но работает не быстро, хочу оптимизировать.

Если заменить кусок
Код: plaintext
1.
2.
select column_value 
    from table( split(:P2_X_FILTER) )

на статическое перечисление ('NEW', 'INPROGRESS') и т.п., то скорость работы возрастает раз в пять.

Возник вопрос, как произвести разрезание строки средствами apex?
То есть передать SQL уже готовый массив строк?
...
Рейтинг: 0 / 0
06.10.2011, 17:36
    #37471447
SvDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование LOV в список строк (SPLIT)
Можно еще попробовать переписать запрос, как-то так

Код: plaintext
1.
2.
3.
4.
5.
select tck_id, tck_text, status_display
from tck_result,
      (select column_value 
       from table( split(:P2_X_FILTER) ) T
where status_display = T.column_value 
  )
или
Код: plaintext
1.
2.
select tck_id, tck_text, status_display
from tck_result
where regexp_instr( status_display, '(^|:)' || :P2_X_FILTER || '(:|$)')> 0  
...
Рейтинг: 0 / 0
06.10.2011, 17:38
    #37471453
SvDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование LOV в список строк (SPLIT)
т.е. так
Код: plaintext
1.
2.
select tck_id, tck_text, status_display
from tck_result
where regexp_instr( :P2_X_FILTER, '(^|:)' || status_display || '(:|$)')> 0  
...
Рейтинг: 0 / 0
07.10.2011, 09:36
    #37472183
Oleg Petrochenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование LOV в список строк (SPLIT)
Т.е. без SQL никак не обойтись?
...
Рейтинг: 0 / 0
07.10.2011, 09:46
    #37472206
Oleg Petrochenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование LOV в список строк (SPLIT)
SvDev,

Верно, так работает шустрее. :)

Спасибо!
...
Рейтинг: 0 / 0
07.10.2011, 18:50
    #37473457
Ivandr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование LOV в список строк (SPLIT)
еще сам SPLIT хорошо бы сделать шустрым
у меня он такой ( если кстати кто знает как сделать быстрей то был бы признателен ):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
CREATE OR REPLACE FUNCTION DWH_HTMLDB.SPLIT (p_list    CLOB,
                                                                        p_del    VARCHAR2 := ';')
   RETURN split_tbl
   PIPELINED
IS
   l_idx     PLS_INTEGER;
   s_idx     PLS_INTEGER;
   e_idx     PLS_INTEGER :=  1 ;
   del_len   PLS_INTEGER;
   i         PLS_INTEGER :=  0 ;
   l_list    VARCHAR2 ( 32767 ) := p_list;
   l_value   VARCHAR2 ( 100 );
BEGIN
   del_len := LENGTH (p_del);

   LOOP
      i := i +  1 ;
      l_idx :=
         INSTR (l_list,
                p_del,
                 1 ,
                i);

      IF i =  1 
      THEN
         s_idx := e_idx;
      ELSE
         s_idx := e_idx + del_len;
      END IF;

      IF l_idx >  0 
      THEN
         PIPE ROW (SUBSTR (l_list, s_idx, l_idx - s_idx));
      ELSE
         PIPE ROW (SUBSTR (l_list, s_idx));
         EXIT;
      END IF;

      e_idx := l_idx;
   END LOOP;

   RETURN;
END split;
/
...
Рейтинг: 0 / 0
07.10.2011, 19:47
    #37473518
SvDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование LOV в список строк (SPLIT)
Ivandr,

По вопросам оптимизации лучше писать в соседний раздел, там много чего интересного подскажут.
Однако же для заданного алгоритма достаточно пройти p_list один раз, а для больших LENGTH (p_del) и LENGTH (p_list) и того меньше.
у вас же в цикле INSTR (l_list, p_del, 1, i); l_list явно намного больше проходится.
...
Рейтинг: 0 / 0
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Преобразование LOV в список строк (SPLIT) / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]