powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA формирование запросов в процедуре
10 сообщений из 10, страница 1 из 1
ASA формирование запросов в процедуре
    #35225745
Alexander Mushnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi all.

сервер ASA 10.
есть хранимая процедура в которой запросы формируются в зависимости от передаваемых параметров, и не только.
Можно было-бы существенно сократить объем кода, если бы формироваь части запросов в переменные
т.е. нечто в этом духе:
...............
declare @kusok_zaprosa varchar(200);
declare @tdt integer;

if @is_bonus = 0 then
select @kusok_zaprosa='is_bonus=0';
else
select @kusok_zaprosa='is_bonus=1';
end if;

select max(trans_datetime) into @tdt
from all_games_oper
where state=0 and @kusok_zaprosa;
................

можно ли такое вытворить? и если да, то как это должно выглядеть?
...
Рейтинг: 0 / 0
ASA формирование запросов в процедуре
    #35225757
vinogradov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexander MushnikovHi all.

сервер ASA 10.
есть хранимая процедура в которой запросы формируются в зависимости от передаваемых параметров, и не только.
Можно было-бы существенно сократить объем кода, если бы формироваь части запросов в переменные
т.е. нечто в этом духе:
...............
declare @kusok_zaprosa varchar(200);
declare @tdt integer;

if @is_bonus = 0 then
select @kusok_zaprosa='is_bonus=0';
else
select @kusok_zaprosa='is_bonus=1';
end if;

select max(trans_datetime) into @tdt
from all_games_oper
where state=0 and @kusok_zaprosa;
................

можно ли такое вытворить? и если да, то как это должно выглядеть?

А динамический SQL разве не подходит. Уж давно существует
...
Рейтинг: 0 / 0
ASA формирование запросов в процедуре
    #35225775
Alexander Mushnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vinogradovА динамический SQL разве не подходит. Уж давно существует
не совсем понял....
может я не совсем полно описал ситуацию:
эта хранимая процедура может быть вызвана из разных мест и приложений (PHP, win32 client, linux client). процедура довольно увесистая и не простая, работает уже давно (система уже в работе), поэтому создавать процедуру на лету каждый раз, перед вызовом - не подходит.
...
Рейтинг: 0 / 0
ASA формирование запросов в процедуре
    #35225787
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во первых, не select @kusok_zaprosa='is_bonus=0'; а set @kusok_zaprosa='is_bonus=0'; Ты диалекты sql-то не путай. Либо один, либо другой, а то вылезет непонятная плюха и будешь три часа разбираться.
Во вторых, использовать @ для обозначения переменных это пережиток страшного T'SQL-ного прошлого.

Ну и в третьих твой пример лучше всего переписать так:
Код: plaintext
1.
2.
select max(trans_datetime) into @tdt
from all_games_oper
where state= 0  and is_bonus=@is_bonus;
и никаких промежуточных переменных вообще не нужно.

И вообще, если у тебя в ХП отдается параметр "@type_of_calculation" то существует масса способов его использовать. Например
Код: plaintext
1.
2.
3.
4.
select max(trans_datetime) into @tdt
from all_games_oper
where state= 0  and ((@type_of_calculation='fisrt type' and is_bonus= 0 ) or
                   ((@type_of_calculation='second type' and is_bonus= 0  and someotherfield= 1 )
                   );
или
Код: plaintext
1.
2.
3.
4.
5.
6.
select max(trans_datetime) into @tdt
from all_games_oper
where state= 0  and (case @type_of_calculation
                    when 'fisrt type' then  is_bonus= 0 
                    when 'second type' then is_bonus= 0  and someotherfield= 1 
                    else somethingelse='abcd'
                    end);
...
Рейтинг: 0 / 0
ASA формирование запросов в процедуре
    #35225791
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Mushnikov vinogradovА динамический SQL разве не подходит. Уж давно существует
не совсем понял....
может я не совсем полно описал ситуацию:
эта хранимая процедура может быть вызвана из разных мест и приложений (PHP, win32 client, linux client). процедура довольно увесистая и не простая, работает уже давно (система уже в работе), поэтому создавать процедуру на лету каждый раз, перед вызовом - не подходит.
"Динамический SQL" это формирование прямо внутри ХП sql-запроса в текстовой переменной и потом запуск этого запроса при помощи команды execute. Но это на саааамый крайний случай. И очень-очень не рекомендуется если можно избежать.
...
Рейтинг: 0 / 0
ASA формирование запросов в процедуре
    #35225819
Alexander Mushnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlВо первых, не select @kusok_zaprosa='is_bonus=0'; а set @kusok_zaprosa='is_bonus=0'; Ты диалекты sql-то не путай. Либо один, либо другой, а то вылезет непонятная плюха и будешь три часа разбираться.
Во вторых, использовать @ для обозначения переменных это пережиток страшного T'SQL-ного прошлого.

вообще-то, я и сам пережиток того самого прошлого...и раньше работал только с ASE.
White OwlНу и в третьих твой пример лучше всего переписать так:
пример переписать то можно, а вот процедуру врят-ли...там совсем иначе. а пример я упростил что-бы не загромождать форум. еще раз повторюсь - процедура "ТРЕХЭТАЖНАЯ"!
- если-бы была возможность сделать так как вы предлагаете, я бы не задавал свой вопрос.
...
Рейтинг: 0 / 0
ASA формирование запросов в процедуре
    #35225826
Alexander Mushnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl"Динамический SQL" это формирование прямо внутри ХП sql-запроса в текстовой переменной и потом запуск этого запроса при помощи команды execute. Но это на саааамый крайний случай. И очень-очень не рекомендуется если можно избежать.
никогда не использовал это .....
ну а почему не рекомендуется? в 2-х словах, если можно....(или ссылочку!)
...
Рейтинг: 0 / 0
ASA формирование запросов в процедуре
    #35225852
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Mushnikov White OwlНу и в третьих твой пример лучше всего переписать так:
пример переписать то можно, а вот процедуру врят-ли...там совсем иначе. а пример я упростил что-бы не загромождать форум. еще раз повторюсь - процедура "ТРЕХЭТАЖНАЯ"!Ну и что? Да хоть четырех-этажная. WatcomSQL это самый гибкий sql диалект из все что я видел (а я видел много :)) В нем можно усложнять запрос до полного безобразия. Вложенные if и case хоть в списке колонок, хоть в условиях.
Alexander Mushnikov- если-бы была возможность сделать так как вы предлагаете, я бы не задавал свой вопрос.Ну почему же.... Вот я сейчас вынужден с ASE жить - какой этот TSQL недоразвитый это просто ужас. Я вполне верю что человек привыкший к нему, не сразу сообразит сделать вложенный if внутри where перейдя на SA. Мне их в ASE чертовски не хватает. И внешние ключи в ASE неудобные. И триггера недоделанные. И клиентские библиотеки больше подходят для мазохистов чем для нормальной работы.

Динамический sql не рекомендуется потому, что его сложно отлаживать. И он будет расшифровываться сервером каждый раз при запуске процедуры. Это конечно не особо критично, но некоторое проседание производительности будет (возможно что и микроскопически неощутимое)
...
Рейтинг: 0 / 0
ASA формирование запросов в процедуре
    #35227401
Alexander Mushnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlWatcomSQL это самый гибкий sql диалект из все что я видел (а я видел много :)) В нем можно усложнять запрос до полного безобразия. Вложенные if и case хоть в списке колонок, хоть в условиях.
сейчас в общем-то так оно у меня и сделано (чере case и if и на первый взгляд очень безобразно) но тем ни менее сам запрос максимально оптимизирован...просто кое что добавлял и хотелось привести в божеский вид...
Почувствовал в ASA бОльшие возможности и подумал - а что если и это возможно;-)
White Owl... Вот я сейчас вынужден с ASE жить - какой этот TSQL недоразвитый это просто ужас. Я вполне верю что человек привыкший к нему, не сразу сообразит сделать вложенный if внутри where перейдя на SA. Мне их в ASE чертовски не хватает. И внешние ключи в ASE неудобные. И триггера недоделанные. И клиентские библиотеки больше подходят для мазохистов чем для нормальной работы....как я Вас понимаю! я недавно с него слез;-)
В моем приложении под вынь, использую dblib.dll - тоже не сахар, возможности есть, но самые интересные функции совершенно не документированы...так что приходится заниматься исследованиями при помощи SQLPP...
White OwlДинамический sql не рекомендуется потому, что его сложно отлаживать. И он будет расшифровываться сервером каждый раз при запуске процедуры. Это конечно не особо критично, но некоторое проседание производительности будет (возможно что и микроскопически неощутимое) ..о...не! производительность на этом серваке очень важна...значит все, вопрос отпал!
Огромное спасибо за ответы!
успехов.
...
Рейтинг: 0 / 0
ASA формирование запросов в процедуре
    #35234485
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, кстати, зря так категорично на счет производительности, ведь АСА вроде
всегда обновляет план перед выполнением любого запроса, динамический он или
нет. Динамический SQL, возможно, вместо трехэтажных селектов будет даже
лучше.
А используется он просто: заводишь строковую переменную, туда пихаешь строку
типа 'select * from table where 1=1', а потом хоть if'ами, хоть case'ами
дописываешь необходимые условия. после всего этого делаешь 'execute
my_query'. Причем в запросе можешь использовать локальные переменные по
имени (select a INTO VAR from table). Если условия нужно добавлять не в
конец запроса а в серединку (т.е. менять условия во вложенных селектах), то
тоже можно так делать, просто буферная переменная будет не одна, а потом
собирать в одну и выполнять.
Я так забубенил целый универсальный интерфейс. На вход процедуре подается
XML с параметрами, а на выходе данные. Ясен пень, что XML позволяет менять
динамически набор параметров (их количество, типы данных и назначение), а в
процедуре прописывается необходимая реакция на все возможные условия,
включая генерацию пользовательского SQL-исключения в случае некорректности
запроса. Такой подход, совместно с технологией хранения всех настроек в БД,
позволяет менять в определенных рамках поведение клиентского приложения без
изменения его кода. И с производительностью все ОК.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA формирование запросов в процедуре
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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