Поиск Oracle Apex 5, отображение результатов, но вставка при точном совпадении

#oracle #oracle-apex-5

#Oracle #oracle-apex-5

Вопрос:

У меня есть поле поиска, которое выполняет поиск (без учета регистра) и возвращает соответствующие значения в табличной форме.

   select STOCKCODE, BARCODE, NAME from TABLE where regexp_like(NAME, :P1_SEARCH, 'i') or regexp_like(BARCODE, :P1_SEARCH, 'i') or regexp_like(STOCKCODE, :P1_SEARCH, 'i')
  

Таким образом, если поиск выполняется для части биржевого КОДА, штрих-кода или НАЗВАНИЯ, он вернет результаты в таблицу. Это означает все результаты, которые соответствуют строке поиска.

Как только у меня есть то, что я хочу, я добавляю значение количества в строку, а затем нажимаю кнопку «Добавить». Эта кнопка только выбирает и вставляет в другую таблицу, используя инструкцию PL / SQL с помощью процедуры.

 BEGIN
insert into TEMP_TABLE (STOCKCODE, NAME, BARCODE) values (:STOCKCODE, :NAME, BARCODE);
END;
  

Все это работает отлично, но выполнение многочисленных поисковых запросов становится сложной задачей, когда вы находите совпадение, а затем должны выбрать его, а затем нажать Добавить. Итак, я хочу сделать следующее. Выполнение поиска при частичном совпадении должно вернуть результаты в табличной форме. Однако известно много кодов, поэтому, если я знаю одно из значений полностью и ввожу его, не отображайте его только в табличной форме, а выполняйте прямую вставку в TEMP_TABLE.

Что-то вроде этого

 select STOCKCODE, BARCODE, NAME from TABLE where regexp_like(NAME, :P1_SEARCH, 'i') or regexp_like(BARCODE, :P1_SEARCH, 'i') or regexp_like(STOCKCODE, :P1_SEARCH, 'i')
if (NAME=:P1_SEARCH) or (BARCODE=P1:SEARCH) or (STOCKCODE=:P1_SEARCH) then
insert into TEMP_TABLE (STOCKCODE, NAME, BARCODE) values (:STOCKCODE, :NAME, BARCODE);
end if;
  

Есть идеи? 😀

Ответ №1:

У вас может быть процесс страницы, который запускается при загрузке страницы и проверяет, соответствует ли ввод полному совпадению:

 begin
  select name, barcode, stockcode
    into l_name, l_barcode, l_stockcode
    from table
   where (NAME=:P1_SEARCH) or (BARCODE=P1:SEARCH) or (STOCKCODE=:P1_SEARCH);

  -- Full match if no exception raised
  insert into TEMP_TABLE (STOCKCODE, NAME, BARCODE) 
     values (l_stockcode, l_name, l_barcode);

  :P1_SHOW_TABFORM := 'N';

exception
   when too_many_rows
     -- Partial match (more than one match found)
     :P1_SHOW_TABFORM := 'Y';
   when no_data_found then
     -- No match found
     (Do whatever you think best here)
end;
  

Затем сделайте отображение отчета в форме табуляции условным для P1_SHOW_TABFORM, равным Y.

Комментарии:

1. Большое спасибо, это работает. Мне пришлось внести некоторые незначительные изменения, чтобы мой regexp_like все еще работал, но он делает именно то, что я хотел!