Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / динамический запрос в сторед функциях / 7 сообщений из 7, страница 1 из 1
26.05.2006, 00:24
    #33752892
q2q
q2q
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический запрос в сторед функциях
имееться простой запрос плана:
select * from Houses
который вызываеться в функции.
необходимо сделать так, чтобы запрос изменялся в зависимости от передоваемой в функцию переменной houseID:
при houseID=-1:
запрос: select * from Houses
при house>-1:
запрос: select * from Houses where hID=houseID

подскажите как это лучше реализовать непосредственно в теле функции.
...
Рейтинг: 0 / 0
26.05.2006, 00:50
    #33752906
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический запрос в сторед функциях
А учебники читать уже не модно?

Код: plaintext
1.
2.
3.
4.
5.
6.
if houseID = - 1  then
   select * from Houses;
elseif houseID > - 1  then
   select * from Houses where hID=houseID;
else
   select 'нету дома с номером ' || houseID;
end if;
...
Рейтинг: 0 / 0
26.05.2006, 09:32
    #33753177
q2q
q2q
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический запрос в сторед функциях
я привел очень простой пример когда ставил вопрос на обсуждение... а если в функции несколько вариаций и происходит несколько ветвлений по нескольким условиям... и запрос не в одну строчку а в 20 ??
что скажешь надо писать 5 страниц текста и запихивать всё это в одну функцию ....
...
Рейтинг: 0 / 0
26.05.2006, 10:24
    #33753331
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический запрос в сторед функциях
Какая база данных рассматривается ?

Я бы рекомендовал написание N разных хранимых процедур вместо одной, по одной на каждый случай. Естественно, главную процедуру можно оставить и она будет перевызывать процедуры с реализацией по какому-то условию.

Это нужно для лучшей работы оптимизатора запросов для каждой из процедур.
Правда есть исключения из этого правила, например, когда таблица очень маленькая и/или планы запросов по жизни всегда плохие и это вас устраивает.
...
Рейтинг: 0 / 0
26.05.2006, 10:39
    #33753382
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический запрос в сторед функциях
MasterZivКакая база данных рассматривается ?

Я бы рекомендовал написание N разных хранимых процедур вместо одной, по одной на каждый случай. Естественно, главную процедуру можно оставить и она будет перевызывать процедуры с реализацией по какому-то условию.

Это нужно для лучшей работы оптимизатора запросов для каждой из процедур.
Правда есть исключения из этого правила, например, когда таблица очень маленькая и/или планы запросов по жизни всегда плохие и это вас устраивает.
Рекомендация катит только под ASE - у ASA нет жесткой компиляции планов процедур, поэтому ей до фени - в одной это все процедуре или сотнях или вообще в динамическом SQL.

q2qимееться простой запрос плана:
select * from Houses
который вызываеться в функции.
необходимо сделать так, чтобы запрос изменялся в зависимости от передоваемой в функцию переменной houseID:
при houseID=-1:
запрос: select * from Houses
при house>-1:
запрос: select * from Houses where hID=houseID

подскажите как это лучше реализовать непосредственно в теле функции.
А что, OR теперь не модно ?
Код: plaintext
1.
2.
3.
SELECT *
FROM Houses
WHERE houseID = - 1  OR hID = houseID;
Очень умный оптимизатор выкинет условие и выполнит полный запрос, если houseID = -1 и наложит условие и воспользуется индексом в обратном случае, так что для таких запросов с использованием констант производительность будет нормальной.

q2qя привел очень простой пример когда ставил вопрос на обсуждение... а если в функции несколько вариаций и происходит несколько ветвлений по нескольким условиям... и запрос не в одну строчку а в 20 ??
что скажешь надо писать 5 страниц текста и запихивать всё это в одну функцию ...
Для более сложных ситуаций существует динамический SQL:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
DECLARE @SQL long varchar;

SET @SQL = '
  SELECT * 
  FROM Houses' || IF houseID <> - 1  THEN '
  WHERE houseID = hID' ENDIF;

EXECUTE IMMEDIATE WITH RESULT SET ON @SQL;
При сборке скрипта в зависимости от условий можно динамически собирать в FROM и WHERE нужные связки таблиц и условий, работает все прекрасно опять же из за отличного оптимизатора ASA.

--
www.rusug.ru - портал русскоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
26.05.2006, 10:58
    #33753435
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический запрос в сторед функциях
ASCRUSРекомендация катит только под ASE - у ASA нет жесткой компиляции планов процедур, поэтому ей до фени - в одной это все процедуре или сотнях или вообще в динамическом SQL.


Я поэтому и спросил, что за СУБД.
...
Рейтинг: 0 / 0
27.05.2006, 01:18
    #33755691
q2q
q2q
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический запрос в сторед функциях
спасибо всем ..
2ASCRUS ..
я пыталя с динамиком разобраться, но у меня не было ни какой информации о ключе with result set .... соответственно не работало ...
завтра буду разбираьться и тестить ..
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / динамический запрос в сторед функциях / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]