Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не выполняется блок if-else в процедуре, Хранимые процедуры Firebird 
V
    Опции темы
loneybibi
  Дата 25.2.2014, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: нет
Всего: 3



Добрый день всем! 
Есть сервер 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;



--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
Akella
Дата 26.2.2014, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



сделайте case вместо нескольких if
PM MAIL   Вверх
Akina
Дата 26.2.2014, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 3
Всего: 453



Да соберите всё в один запрос:

Код

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" 
  




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
loneybibi
Дата 26.2.2014, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: нет
Всего: 3



Цитата(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" 
  

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


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
loneybibi
  Дата 26.2.2014, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: нет
Всего: 3



Вот код к которому я пришел. Но теперь другая проблема! 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;


Это сообщение отредактировал(а) loneybibi - 26.2.2014, 22:04


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
Akella
Дата 27.2.2014, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



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


а что справки и Интернета недостаточно?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.1237 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.