Oracle APEX 4.2 Пользовательский поиск в классическом отчете

Я использую Oracle APEX 4.2. Я хочу реализовать функцию поиска в своем классическом отчете. У меня есть рабочий код, который извлекает данные, и функция поиска работает отлично. Но когда я хочу использовать предложение order by внутри этого кода, я получаю «данные не найдены», как я могу реализовать предложение order by в этом коде, чтобы мой отчет был правильно отсортирован, а функция поиска по-прежнему работала правильно.

Ниже приведен рабочий код, который позволяет выполнять поиск в классическом отчете:

 declare
     a_query varchar2(5000);
     this_strin varchar2(50);
 begin
  a_query := 'select flight_nmbr, sequence_nmbr'||
         'from flights '||
         'where sequence_nmbr >= 0'||
         'and data_version_name = '''||
         :P3_DATA_VERSION || '''';
 if :P3_SEARCH_NUMBER is not null then
   if instr(:P3_SEARCH_NUMBER, '%') > 0 then
     this_strin := :P3_SEARCH_NUMBER;
   else
     this_strin := '%'||:P3_SEARCH_NUMBER||'%';
   end if;
    a_query := a_query||chr(10)||
            ' and flight_nmbr like '''|| upper(this_strin) ||'''';
   end if;
   return a_query;
  end;

Вот тот же фрагмент кода, который говорит «данные не найдены», когда я добавляю в запрос предложение order by:

 declare
     a_query varchar2(5000);
     this_strin varchar2(50);
 begin
  a_query := 'select flight_nmbr, sequence_nmbr'||
         'from flights '||
         'where sequence_nmbr >= 0'||
         'and data_version_name = '''||
         'order by sequence_nmbr 1'|| ------------------Order by clause
         :P3_DATA_VERSION || '''';
 if :P3_SEARCH_NUMBER is not null then
   if instr(:P3_SEARCH_NUMBER, '%') > 0 then
     this_strin := :P3_SEARCH_NUMBER;
   else
     this_strin := '%'||:P3_SEARCH_NUMBER||'%';
   end if;
    a_query := a_query||chr(10)||
            ' and flight_nmbr like '''|| upper(this_strin) ||'''';
   end if;
   return a_query;
  end;

person Chris M    schedule 19.01.2018    source источник
comment
Пожалуйста, не используйте тег oracle-apex-5, если вы используете APEX 4.2. Это сбивает с толку.   -  person Dmitriy    schedule 19.01.2018


Ответы (2)


Не относится к вашему вопросу, но - почему бы вам не перейти на интерактивный отчет? Он предлагает гораздо больше, чем классический отчет, вам не кажется?

Что касается вашей проблемы: если вы посмотрите на запрос, который не работает, его SELECT выглядит так (я удалил одинарные кавычки):

and data_version_name =  ||
order by sequence_nmbr 1 || ------------------Order by clause
:P3_DATA_VERSION         || 
and flight_nmbr like upper(this_strin)

Либо вы не разместили фактический код, либо это в целом неверно - надеюсь, вы видите, что здесь не так. ORDER BY должно быть последним предложением. Кроме того, что делает эта цифра в конце ORDER BY?

Я предлагаю вам сначала отобразить содержимое A_QUERY, проверить, работает ли он нормально (в SQL * Plus, TOAD, SQL Developer или любом другом инструменте, который вы используете), и - как только вы будете удовлетворены этим - позвольте ему работать в Apex.

person Littlefoot    schedule 19.01.2018

Очевидно, ваша проблема здесь:

begin
  a_query := 'select flight_nmbr, sequence_nmbr'||
         'from flights '||
         'where sequence_nmbr >= 0'||
         'and data_version_name = '''||   -- double qoute!!!
         'order by sequence_nmbr 1'|| ------------------Order by clause
         :P3_DATA_VERSION || '''';

Из-за этой избыточной двойной кавычки ваш результирующий запрос выглядит так:

select flight_nmbr, sequence_nmbr
  from flights
 where sequence_nmbr >= 0
   and data_version_name = 'order by sequence_nmbr 1<value of P3_DATA_VERSION item>';

Как только таблица не имеет значения order by sequence_nmbr 1 в столбце data_version_name, запрос не возвращает строк.

Вторая проблема, с которой вы столкнетесь, когда исправите эту, находится здесь:

if :P3_SEARCH_NUMBER is not null then

Когда этот оператор будет true, вы получите запрос, в котором условие and flight_nmbr like ... стоит после предложения ORDER BY.

Кстати, я бы порекомендовал вам написать простой запрос для отчета. Генерация SQL динамически приводит к таким ошибкам и также стоит вам снижения производительности.

person Dmitriy    schedule 19.01.2018