Динамическое построение запроса в ХП

Geminis
Дата: 30.09.2005 17:54:11
Пятницццааа...
всякие мысли в голову лезут под конец рабочего дня...

Кто-нить пробовал в ХП организовать такую муть:
передавать параметр(ы), который/е влияли бы на запрос(ы) внутри этой ХП - то бишь динамически строить запрос(ы), а конкретней - задавать его/их условия?

типа :
CREATE PROCEDURE TMP_1 (
    X_DATE1 DATE,
    X_DATE2 DATE,
    X1 SMALLINT,
    X2 SMALLINT,
    X3 SMALLINT)
RETURNS (
    R_KONTR INTEGER)
AS
begin

for
 select distinct SOMEFIELD
 from SOMETABLE left join ANOTHERTABLE on STF2 = ATF1
 where
  STF4 between :X_DATE1 and :X_DATE2 

 если (:x1 is not null) тогды добавляем условие
  and ATF1 = 1 
 конецесли

 если (:x2 is not null) тогды добавляем условие
  and ATF2 = 1 
 конецесли

 если (:x3 is not null) тогды добавляем условие
  and ATF3 = 1
 конецесли

где ATF1, ATF2, ATF3 - поля типа smallint для признака да/нет - 1/null.

Пробовал просто написать условие как
and ATF3 = (case :x3 when 1 then 1 when 0 then null else ATF3 end)
но тогда срабатывает только один параметр.

Как это делается по-человечески?
Мимопроходящий
Дата: 30.09.2005 17:58:25

Привет, Geminis!
Ты пишешь:

Geminis
G> Как это делается по-человечески?

По-человечески это делается формированием запроса на клиенте.
Без SP.
Селективные SP вообще бывают нужны только в специфических случая.
Здесь не тот случай.

ЗЫ: некоторые проктологи сейчас тебе насоветуют EXECUTE STATEMENT...

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.3

Geminis
Дата: 30.09.2005 18:02:46
Мимопроходящий

Привет, Geminis!
Ты пишешь:

Geminis
G> Как это делается по-человечески?

По-человечески это делается формированием запроса на клиенте.
Без SP.
Селективные SP вообще бывают нужны только в специфических случая.
Здесь не тот случай.

ЗЫ: некоторые проктологи сейчас тебе насоветуют EXECUTE STATEMENT...

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.3


Понятнинько...
Пасибки!
Просто размечтался, что забабахаю ХПшку в которую через параметры задается что именно хотят видеть на клиенте (к примеру, отчет по клиентам, поставщика, и по тем и по тем), а в случае необходимости править только ХПшку (т.е. прогу модифицировать не нуна).
Anjey aka PM
Дата: 30.09.2005 18:54:19
Geminis

Кто-нить пробовал в ХП организовать такую муть:
передавать параметр(ы), который/е влияли бы на запрос(ы) внутри этой ХП - то бишь динамически строить запрос(ы), а конкретней - задавать его/их условия?

типа :
CREATE PROCEDURE TMP_1 (
    X_DATE1 DATE,
    X_DATE2 DATE,
    X1 SMALLINT,
    X2 SMALLINT,
    X3 SMALLINT)
RETURNS (
    R_KONTR INTEGER)
AS
begin

for
 select distinct SOMEFIELD
 from SOMETABLE left join ANOTHERTABLE on STF2 = ATF1
 where
  STF4 between :X_DATE1 and :X_DATE2 

 если (:x1 is not null) тогды добавляем условие
  and ATF1 = 1 
 конецесли

 если (:x2 is not null) тогды добавляем условие
  and ATF2 = 1 
 конецесли

 если (:x3 is not null) тогды добавляем условие
  and ATF3 = 1
 конецесли

где ATF1, ATF2, ATF3 - поля типа smallint для признака да/нет - 1/null.

Пробовал просто написать условие как
and ATF3 = (case :x3 when 1 then 1 when 0 then null else ATF3 end)
но тогда срабатывает только один параметр.

Как это делается по-человечески?


Если тебе надо именно в ХП и не хочешь использовать EXECUTE STATEMENT можешь построить так:

 select distinct SOMEFIELD
 from SOMETABLE left join ANOTHERTABLE on STF2 = ATF1
 where
  STF4 between :X_DATE1 and :X_DATE2 
  and (ATF1 = 1 OR :x1 IS NULL)
  and (ATF2 = 1 OR :x2 IS NULL)
  and (ATF3 = 1 OR :x3 IS NULL)

Но план по твоему запросу будет построен немного жутковатый :)
Дегтярев Евгений
Дата: 02.10.2005 11:56:42
Geminis
Просто размечтался, что забабахаю ХПшку в которую через параметры задается что именно хотят видеть на клиенте (к примеру, отчет по клиентам, поставщика, и по тем и по тем), а в случае необходимости править только ХПшку (т.е. прогу модифицировать не нуна).

Для таких вещей делаются отчеты, которые в случае необходимости и правятся.


to Мимопроходящий
К проктологам отнешения никакого не имел :) , но EXECUTE STATEMENT использовал при решении одной задачи.
Необходимо посчитать итоговый балл у абитуриента по результатам вступительных испытаний. Все бы ничего, но разные факультеты на разных специальностях используют разное количество экзаменов и различные формулы, отличающиеся от суммы. Например, на матфаке - результат по математике умножают на 2 прибавляют к этому результат по русскому и все делать на 3 - (oc1*2+oc2)/3. Сумма баллов должна расчитываться на сервере. Для каждой специальности указана формула, и есть процедура которая которая вычисляет балл для конкретного абитуриента, динамически строится текст запроса и выполняется через EXECUTE STATEMENT.
Если у кого есть другое решение - подскажите.
Гаджимурадов Рустам
Дата: 02.10.2005 13:13:35
Дегтярев Евгений
Необходимо посчитать итоговый балл у абитуриента по результатам вступительных испытаний. Все бы ничего, но разные факультеты на разных специальностях используют разное количество экзаменов и различные формулы, отличающиеся от суммы. Например, на матфаке - результат по математике умножают на 2 прибавляют к этому результат по русскому и все делать на 3 - (oc1*2+oc2)/3. Сумма баллов должна расчитываться на сервере. Для каждой специальности указана формула, и есть процедура которая которая вычисляет балл для конкретного абитуриента, динамически строится текст запроса и выполняется через EXECUTE STATEMENT.
Если у кого есть другое решение - подскажите.
А не вариант было на каждую формулу отдельный запрос написать?
Или слишком много выходило? Вариантов-то не так уж и много (кажись).
Дегтярев Евгений
Дата: 03.10.2005 06:49:49
С десяток наберется, наверное, но конкурсных позиций (это специальность в разрезе факультета, формы обучения и формы финансирования) боле 60. Будет слишком громоздкая конструкция. Плюс к этому с завидным постоянством проявляется непостоянство факультетов, в результате формула меняется...
Гаджимурадов Рустам
Дата: 03.10.2005 06:59:51
А на клиенте собирать не вариант?
Юрий Носов
Дата: 03.10.2005 08:55:33
Гаджимурадов Рустам
А на клиенте собирать не вариант?

А свернуть формулу и коэффиценты в таблицу записать не катит?
Sash*
Дата: 03.10.2005 10:57:22
Geminis
Пятницццааа...
всякие мысли в голову лезут под конец рабочего дня...

Кто-нить пробовал в ХП организовать такую муть:
передавать параметр(ы), который/е влияли бы на запрос(ы) внутри этой ХП - то бишь динамически строить запрос(ы), а конкретней - задавать его/их условия?

типа :

Как это делается по-человечески?

Эээ, вот когда появятся необязательные параметры, такая конструкция будет намного симпатишнее