Добавление пользовательского поиска для классического отчета - PullRequest
0 голосов
/ 22 апреля 2019

Я хочу добавить поиск в свой классический отчет, поэтому я добавил текстовое поле и кнопку на своей странице над отчетом и добавил на страницу процесс, выполняющий код PL / SQL:

DECLARE
    v_sql varchar2(4000);
BEGIN
IF :P3_SEARCH IS NOT NULL THEN
    v_sql := q'[select field1, field2, field3
           FROM Table1
           WHERE category_id = ]' ||TO_NUMBER(:P3_CATEGORY)||
           q'[ AND (function(id) LIKE '%]'||:P3_SEARCH||| 
           q'[%' OR field2 LIKE '%]' ||:P3_SEARCH|| 
           q'[%' OR field3 LIKE '%]' ||:P3_SEARCH|| q'[%')]';
ELSE
    v_sql := q'[select field1, field2, field3
           FROM Table1
           WHERE category_id = ]' ||TO_NUMBER(:P3_CATEGORY)|| q'[]';
    END IF;

  apex_debug.MESSAGE('my query is: ' || v_sql);      

    --   RETURN v_sql;
END;

У меня есть две проблемы - мой результирующий запрос не получается, как ожидалось - % знаки исчезают и вместо

select field1, field2, field3
FROM Table1
WHERE category_id = 4
AND (function(id) like '%test%' OR field2 like '%test%' OR field3 like '%test%')

Я получаю

select field1, field2, field3
FROM Table1
WHERE category_id = 4
AND (function(id) like 'test' OR field2 like 'test' OR field3 like 'test')

И я также не могу понять, как переключить исходный sql для моего региона отчета при нажатии кнопки поиска. Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 22 апреля 2019

Должен ли он быть динамическим? Потому что в этом запросе нет ничего динамического . Если вас беспокоит :P3_SEARCH, то выход есть. Упрощенно это выглядит так:

select something
from some_table
where some_column = :P3_SEARCH        --> condition A
   or :P3_SEARCH is null;             --> condition B

Расширенный по вашему запросу, он может быть переписан следующим образом:

select field1, field2, field3
from table1
where category_id = to_number(:P3_CATEGORY)
  and (  
         --> condition A begins here
         -- condition for P3_SEARCH is not null
        (     :P3_SEARCH is not null
          and(   function(id) like '%' || :P3_SEARCH || '%'
              or field2       like '%' || :P3_SEARCH || '%'
              or field3       like '%' || :P3_SEARCH || '%'
             )
        )
        --> condition A ends here  
      or :P3_SEARCH is null        --> condition B
     );

Посмотрите, поможет ли это.

...