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

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

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

Единственное, что приходит в голову, фильтровать строки прямо в 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
Преобразование LOV в список строк (SPLIT)
    #37471447
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще попробовать переписать запрос, как-то так

Код: 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
Преобразование LOV в список строк (SPLIT)
    #37471453
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. так
Код: plaintext
1.
2.
select tck_id, tck_text, status_display
from tck_result
where regexp_instr( :P2_X_FILTER, '(^|:)' || status_display || '(:|$)')> 0  
...
Рейтинг: 0 / 0
Преобразование LOV в список строк (SPLIT)
    #37472183
Oleg Petrochenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. без SQL никак не обойтись?
...
Рейтинг: 0 / 0
Преобразование LOV в список строк (SPLIT)
    #37472206
Oleg Petrochenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SvDev,

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

Спасибо!
...
Рейтинг: 0 / 0
Преобразование LOV в список строк (SPLIT)
    #37473457
Ivandr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
еще сам 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
Преобразование LOV в список строк (SPLIT)
    #37473518
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivandr,

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


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