Как отследить Null значения в хранимых процедурах?

Модераторы: kdv, CyberMax

Ответить
Zhekius
Сообщения: 25
Зарегистрирован: 08 июл 2008, 14:57

Как отследить Null значения в хранимых процедурах?

Сообщение Zhekius » 05 авг 2010, 14:28

Всем добрый день. Есть хранимая процедура выборки строк из таблицы. БД FireBird 2.1. Таблица 1 млн записей. Индексы построены по запрашиваемым полям. Основное тело хранимой процедуры такое:

Код: Выделить всё

begin
    for select v.family, v.name, V.farther, v.sex, V.date_born,
    v.doc_name, v.doc_nomb, v.streetname, v.housenomber, v.kvartirano
    from
    vibor2000 V
    where v.family starting with :like_family
    and v.name starting with :like_name
    and v.farther starting with :like_farther
    and v.streetname starting with :like_streetname
    and v.housenomber starting with :like_housenomber
    and v.kvartirano starting with :like_kvartirano
            into
            :family,
            :name,
            :farther,
            :sex,
            :date_born,
            :doc_name,
            :doc_nomb,
            :streetname,
            :housenomber,
            :kvartirano
    do
    begin
    suspend;
    end
end
Как видно из запроса, любой параметр для Starting With должен работать не при Null значениях, а при значении типа ''. Есть ли какие-нибудь языковые конструкции для хранимой процедуры, чтобы отследить условие того, что некоторые запросы идут типа NULL и не использовать их в запросах, чтобы увеличить скорость ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Как отследить Null значения в хранимых процедурах?

Сообщение kdv » 06 авг 2010, 01:33

where field is not null

c этим какие-то сложности?

Zhekius
Сообщения: 25
Зарегистрирован: 08 июл 2008, 14:57

Re: Как отследить Null значения в хранимых процедурах?

Сообщение Zhekius » 06 авг 2010, 07:35

where field is not null

c этим какие-то сложности?
Если отталкиваться от примера, то значения для каждого параметра могут быть как пустыми, так и не пустыми. Причем, это может быть в первом и третьем, в первом-четвертом-пятом, только во втором и т.д. Т.е. как отследить условности? Лепить кучу IF-ELSE для каждого параметра, если он IS NOT NUL? или дополнительные ХП?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Как отследить Null значения в хранимых процедурах?

Сообщение kdv » 06 авг 2010, 11:43

тогда зачем Вам нужен null? не используйте его. Если у Вас там во всех полях могут быть null - тогда да, мучайтесь с проверкой и на null и на значение параметра.

добавлю, что в случае
and v.kvartirano starting with :like_kvartirano

параметр не может быть null. Вернее, если он может быть null, то Вы его можете проверить на null только так
:like_kvartirano is null.

В общем, если есть возможность заменить null на пустые строки - меняйте.

Zhekius
Сообщения: 25
Зарегистрирован: 08 июл 2008, 14:57

Re: Как отследить Null значения в хранимых процедурах?

Сообщение Zhekius » 09 авг 2010, 09:21

Спасибо, с Null разобрался. По этому же примеру вопрос:
если пользователь с клиентского приложения из пяти параметров заполнил только один, скажем только KvartiraNo, и запустил процедуру. Как мне быть сдругими (незаполненными) параметрами? Я оставляю их пустыми, чтобы критерий поиска соответствовал истине. Ничего в этом страшного нет? Мне главное - производительность.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Как отследить Null значения в хранимых процедурах?

Сообщение Dimitry Sibiryakov » 09 авг 2010, 14:44

Если тебе главное - производительность, то в данном случае забудь про процедуру и собирай SQL запрос динамически на клиенте.

Zhekius
Сообщения: 25
Зарегистрирован: 08 июл 2008, 14:57

Re: Как отследить Null значения в хранимых процедурах?

Сообщение Zhekius » 10 авг 2010, 08:16

Ясно. Есть у меня еще процедура по еще большему поиску полей, причем с теми же
Starting With. Аж где-то девять штук. Если береться последий Starting with (а остальные пустые, не Null), то поиск по индексу все-равно как-то подтормаживает.
Я в таком случае, разобью процедуру на три блока или сделаю три подпроцедуры для разных условий. Кстати, в ХП можно оператор условности где-нибудь забабахать в середине выборки? :)

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Как отследить Null значения в хранимых процедурах?

Сообщение kdv » 10 авг 2010, 21:37

Кстати, в ХП можно оператор условности где-нибудь забабахать в середине выборки?
В SQL - нет. Вы пишете сразу запрос с условиями. Eсть, конечно, case, но "вдруг" это не приведет к изменению выполнения запроса "посередине".
В ХП выполняется SQL. Как бы, всё.

Zhekius
Сообщения: 25
Зарегистрирован: 08 июл 2008, 14:57

Re: Как отследить Null значения в хранимых процедурах?

Сообщение Zhekius » 11 авг 2010, 06:34

Ну впринципе всё. :D Всем спасибо. Тема закрыта.

Ответить