diff --git a/db/PKG_P8PANELS_BASE.pck b/db/PKG_P8PANELS_BASE.pck index 2a54068..483dffa 100644 --- a/db/PKG_P8PANELS_BASE.pck +++ b/db/PKG_P8PANELS_BASE.pck @@ -27,6 +27,13 @@ create or replace package PKG_P8PANELS_BASE as NDOCUMENT in number -- Рег. номер документа ) return number; -- Флаг доступности (см. константы NACCESS_*) + /* Подготовка пользовательской строки поиска для вставки в запрос */ + procedure UTL_SEARCH_PREPARE + ( + SSEARCH in varchar2, -- Пользовательская строка поиска + SSEARCH_PREPARED out varchar2 -- Подготовленная строка поиска + ); + /* Базовое исполнение действий */ procedure PROCESS ( @@ -191,6 +198,36 @@ create or replace package body PKG_P8PANELS_BASE as return NACCESS_NO; end UTL_DOC_ACCESS_CHECK; + /* Подготовка пользовательской строки поиска для вставки в запрос */ + procedure UTL_SEARCH_PREPARE + ( + SSEARCH in varchar2, -- Пользовательская строка поиска + SSEARCH_PREPARED out varchar2 -- Подготовленная строка поиска + ) + is + /* Локальные константы */ + SANY_SYS constant char(1) := '%'; -- Маска "любое количество любых символов" Oracle + SONE_SYS constant char(1) := '_'; -- Маска "любой один символ" Oracle + SENT_WRD_DELIM constant varchar2(1) := ' '; -- Разделитель слов в предложении + SANY_PRS constant varchar2(240) := PKG_OPTIONS.STARSYMB; -- Маска "любое количество любых символов" Парус + SONE_PRS constant varchar2(240) := PKG_OPTIONS.QUESTSYMB; -- Маска "любой один символ" Парус + begin + /* Если пользовательская строка пустая - то это всё что угодно */ + if (SSEARCH is null) + then + SSEARCH_PREPARED := SANY_SYS; + else + /* Подменим пользовательские маски на системные и соберем подготовленную строку поиска */ + SSEARCH_PREPARED := '%' || replace(replace(replace(SSEARCH + ,SANY_PRS + ,SANY_SYS) + ,SONE_PRS + ,SONE_SYS) + ,SENT_WRD_DELIM + ,SANY_SYS) || '%'; + end if; + end UTL_SEARCH_PREPARE; + /* Формирование сообщения об отсутствии значения */ function MSG_NO_DATA_MAKE (