Страница 1 из 1

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

Добавлено: 05 авг 2010, 14:28
Zhekius
Всем добрый день. Есть хранимая процедура выборки строк из таблицы. БД 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 и не использовать их в запросах, чтобы увеличить скорость ?

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

Добавлено: 06 авг 2010, 01:33
kdv
where field is not null

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

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

Добавлено: 06 авг 2010, 07:35
Zhekius
where field is not null

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

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

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

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

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

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

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

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

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

Добавлено: 09 авг 2010, 14:44
Dimitry Sibiryakov
Если тебе главное - производительность, то в данном случае забудь про процедуру и собирай SQL запрос динамически на клиенте.

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

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

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

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

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

Добавлено: 11 авг 2010, 06:34
Zhekius
Ну впринципе всё. :D Всем спасибо. Тема закрыта.