Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > Не выполняется блок if-else в процедуре


Автор: loneybibi 25.2.2014, 21:52
Добрый день всем! 
Есть сервер FireBird 2.1, SQLDialect3.
В базе данных описана вот такая хранимая процедура, но в ней третий "if" когда (FILTER_TYPE=2) не хочет работать и все время выдает пустую выборку.
Прошу подсказать что не так в этой процедуре или логике,
как правильно описать LIKE запрос в данной ситуации?
Что еще может быть не так ? За советы по улучшению и простоте отдельное спасибо.

Заранее большое спасибо.

На входе подается 0,1 или 2. При 0 выбираються все данные из таблицы, при 1 из второго столбца по второму входящему параметру, при 2 из третьего по входящему параметру. Вообщем что бы не писать отдельные процедуры для каждого варианта.

Код

SET TERM ^ ;

CREATE OR ALTER PROCEDURE GET_CONTRAGENT (
    filter_type integer not null,
    filter_value char(128))
returns (
    "ID-CUSTOMER" numeric(16,0),
    name char(128),
    kodedrpou char(128))
as
begin

 if(FILTER_TYPE=0)then
  begin
   for
    select "ID-CUSTOMER","NAME","KODEDRPOU"
     from CONTRAGENT
      into :"ID-CUSTOMER",:"NAME",:"KODEDRPOU"
   do
    suspend;
  end
   else
    if(FILTER_TYPE=1)then
     begin
      for
       select "ID-CUSTOMER","NAME","KODEDRPOU"
        from CONTRAGENT where "NAME" like :filter_value
         into :"ID-CUSTOMER",:"NAME",:"KODEDRPOU"
      do
       suspend;
     end
      else
       if(filter_type=2)then
        begin
         for
          select "ID-CUSTOMER","NAME","KODEDRPOU"
           from CONTRAGENT where "KODEDRPOU" like :filter_value
            into :"ID-CUSTOMER",:"NAME",:"KODEDRPOU"
         do
          suspend;
        end

end^

SET TERM ; ^

GRANT SELECT ON CONTRAGENT TO PROCEDURE GET_CONTRAGENT;

GRANT EXECUTE ON PROCEDURE GET_CONTRAGENT TO SYSDBA;

Автор: Akella 26.2.2014, 10:35
сделайте case вместо нескольких if

Автор: Akina 26.2.2014, 11:41
Да соберите всё в один запрос:

Код

select "ID-CUSTOMER","NAME","KODEDRPOU" 
from CONTRAGENT 
where (FILTER_TYPE=0)
OR (("NAME" like :filter_value) AND (FILTER_TYPE=1))
OR (("KODEDRPOU" like :filter_value) AND (FILTER_TYPE=2))
into :"ID-CUSTOMER",:"NAME",:"KODEDRPOU" 
  


Автор: loneybibi 26.2.2014, 20:51
Цитата(Akella @ 26.2.2014,  09:35)
сделайте case вместо нескольких if

Пытался вот по такой схеме не получается!
Код

CASE a  
  WHEN 1 THEN SELECT "Один";   
  WHEN 2 THEN SELECT "Два";   
  WHEN 3 THEN SELECT "Три";  
  ELSE SELECT 'Нечто другое';   
 END CASE;


Приведите пожалуйста пример правильно case для firebird 2.1.

Добавлено через 1 минуту и 50 секунд
Цитата(Akina @ 26.2.2014,  10:41)
Да соберите всё в один запрос:

Код

select "ID-CUSTOMER","NAME","KODEDRPOU" 
from CONTRAGENT 
where (FILTER_TYPE=0)
OR (("NAME" like :filter_value) AND (FILTER_TYPE=1))
OR (("KODEDRPOU" like :filter_value) AND (FILTER_TYPE=2))
into :"ID-CUSTOMER",:"NAME",:"KODEDRPOU" 
  

Спасибо! Ваш вариант работает как надо вроде. Не могли бы вы пояснить его работу и принцып подробнее!?

Автор: loneybibi 26.2.2014, 22:01
Вот код к которому я пришел. Но теперь другая проблема! LIKE  не работает нормально. 
Он отбирает только те значения которые точно соответствуют запросу. 
Например есть запись "ooo telekom" и выберется она только тогда когда FILTER_VALUE
будет соответствовать этой полной фразе, если написать "tel" то будет пустой результат.
Как исправить что бы он выбирал все похожее? 

Код

for
  select "ID-CUSTOMER","NAME","KODEDRPOU"
   from CONTRAGENT
    where (:FILTER_TYPE=0)
     OR (("NAME" like '%' || :filter_value || '%') AND (:FILTER_TYPE=1))
      OR (("KODEDRPOU" like '%' || :filter_value || '%') AND (:FILTER_TYPE=2))
       into :"ID-CUSTOMER",:"NAME",:"KODEDRPOU"
   do
    suspend;

Автор: Akella 27.2.2014, 12:53
Цитата(loneybibi @  26.2.2014,  20:51 Найти цитируемый пост)
Приведите пожалуйста пример правильно case для firebird 2.1.


а что справки и Интернета недостаточно?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)