|
|
|
ASA формирование запросов в процедуре
|
|||
|---|---|---|---|
|
#18+
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; ................ можно ли такое вытворить? и если да, то как это должно выглядеть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2008, 20:10 |
|
||
|
ASA формирование запросов в процедуре
|
|||
|---|---|---|---|
|
#18+
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 разве не подходит. Уж давно существует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2008, 20:15 |
|
||
|
ASA формирование запросов в процедуре
|
|||
|---|---|---|---|
|
#18+
vinogradovА динамический SQL разве не подходит. Уж давно существует не совсем понял.... может я не совсем полно описал ситуацию: эта хранимая процедура может быть вызвана из разных мест и приложений (PHP, win32 client, linux client). процедура довольно увесистая и не простая, работает уже давно (система уже в работе), поэтому создавать процедуру на лету каждый раз, перед вызовом - не подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2008, 20:24 |
|
||
|
ASA формирование запросов в процедуре
|
|||
|---|---|---|---|
|
#18+
Во первых, не select @kusok_zaprosa='is_bonus=0'; а set @kusok_zaprosa='is_bonus=0'; Ты диалекты sql-то не путай. Либо один, либо другой, а то вылезет непонятная плюха и будешь три часа разбираться. Во вторых, использовать @ для обозначения переменных это пережиток страшного T'SQL-ного прошлого. Ну и в третьих твой пример лучше всего переписать так: Код: plaintext 1. 2. И вообще, если у тебя в ХП отдается параметр "@type_of_calculation" то существует масса способов его использовать. Например Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2008, 20:28 |
|
||
|
ASA формирование запросов в процедуре
|
|||
|---|---|---|---|
|
#18+
Alexander Mushnikov vinogradovА динамический SQL разве не подходит. Уж давно существует не совсем понял.... может я не совсем полно описал ситуацию: эта хранимая процедура может быть вызвана из разных мест и приложений (PHP, win32 client, linux client). процедура довольно увесистая и не простая, работает уже давно (система уже в работе), поэтому создавать процедуру на лету каждый раз, перед вызовом - не подходит. "Динамический SQL" это формирование прямо внутри ХП sql-запроса в текстовой переменной и потом запуск этого запроса при помощи команды execute. Но это на саааамый крайний случай. И очень-очень не рекомендуется если можно избежать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2008, 20:31 |
|
||
|
ASA формирование запросов в процедуре
|
|||
|---|---|---|---|
|
#18+
White OwlВо первых, не select @kusok_zaprosa='is_bonus=0'; а set @kusok_zaprosa='is_bonus=0'; Ты диалекты sql-то не путай. Либо один, либо другой, а то вылезет непонятная плюха и будешь три часа разбираться. Во вторых, использовать @ для обозначения переменных это пережиток страшного T'SQL-ного прошлого. вообще-то, я и сам пережиток того самого прошлого...и раньше работал только с ASE. White OwlНу и в третьих твой пример лучше всего переписать так: пример переписать то можно, а вот процедуру врят-ли...там совсем иначе. а пример я упростил что-бы не загромождать форум. еще раз повторюсь - процедура "ТРЕХЭТАЖНАЯ"! - если-бы была возможность сделать так как вы предлагаете, я бы не задавал свой вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2008, 20:47 |
|
||
|
ASA формирование запросов в процедуре
|
|||
|---|---|---|---|
|
#18+
White Owl"Динамический SQL" это формирование прямо внутри ХП sql-запроса в текстовой переменной и потом запуск этого запроса при помощи команды execute. Но это на саааамый крайний случай. И очень-очень не рекомендуется если можно избежать. никогда не использовал это ..... ну а почему не рекомендуется? в 2-х словах, если можно....(или ссылочку!) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2008, 20:53 |
|
||
|
ASA формирование запросов в процедуре
|
|||
|---|---|---|---|
|
#18+
Alexander Mushnikov White OwlНу и в третьих твой пример лучше всего переписать так: пример переписать то можно, а вот процедуру врят-ли...там совсем иначе. а пример я упростил что-бы не загромождать форум. еще раз повторюсь - процедура "ТРЕХЭТАЖНАЯ"!Ну и что? Да хоть четырех-этажная. WatcomSQL это самый гибкий sql диалект из все что я видел (а я видел много :)) В нем можно усложнять запрос до полного безобразия. Вложенные if и case хоть в списке колонок, хоть в условиях. Alexander Mushnikov- если-бы была возможность сделать так как вы предлагаете, я бы не задавал свой вопрос.Ну почему же.... Вот я сейчас вынужден с ASE жить - какой этот TSQL недоразвитый это просто ужас. Я вполне верю что человек привыкший к нему, не сразу сообразит сделать вложенный if внутри where перейдя на SA. Мне их в ASE чертовски не хватает. И внешние ключи в ASE неудобные. И триггера недоделанные. И клиентские библиотеки больше подходят для мазохистов чем для нормальной работы. Динамический sql не рекомендуется потому, что его сложно отлаживать. И он будет расшифровываться сервером каждый раз при запуске процедуры. Это конечно не особо критично, но некоторое проседание производительности будет (возможно что и микроскопически неощутимое) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2008, 21:20 |
|
||
|
ASA формирование запросов в процедуре
|
|||
|---|---|---|---|
|
#18+
White OwlWatcomSQL это самый гибкий sql диалект из все что я видел (а я видел много :)) В нем можно усложнять запрос до полного безобразия. Вложенные if и case хоть в списке колонок, хоть в условиях. сейчас в общем-то так оно у меня и сделано (чере case и if и на первый взгляд очень безобразно) но тем ни менее сам запрос максимально оптимизирован...просто кое что добавлял и хотелось привести в божеский вид... Почувствовал в ASA бОльшие возможности и подумал - а что если и это возможно;-) White Owl... Вот я сейчас вынужден с ASE жить - какой этот TSQL недоразвитый это просто ужас. Я вполне верю что человек привыкший к нему, не сразу сообразит сделать вложенный if внутри where перейдя на SA. Мне их в ASE чертовски не хватает. И внешние ключи в ASE неудобные. И триггера недоделанные. И клиентские библиотеки больше подходят для мазохистов чем для нормальной работы....как я Вас понимаю! я недавно с него слез;-) В моем приложении под вынь, использую dblib.dll - тоже не сахар, возможности есть, но самые интересные функции совершенно не документированы...так что приходится заниматься исследованиями при помощи SQLPP... White OwlДинамический sql не рекомендуется потому, что его сложно отлаживать. И он будет расшифровываться сервером каждый раз при запуске процедуры. Это конечно не особо критично, но некоторое проседание производительности будет (возможно что и микроскопически неощутимое) ..о...не! производительность на этом серваке очень важна...значит все, вопрос отпал! Огромное спасибо за ответы! успехов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2008, 14:36 |
|
||
|
ASA формирование запросов в процедуре
|
|||
|---|---|---|---|
|
#18+
Ну, кстати, зря так категорично на счет производительности, ведь АСА вроде всегда обновляет план перед выполнением любого запроса, динамический он или нет. Динамический 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 00:04 |
|
||
|
|

start [/forum/topic.php?fid=55&tid=2011643]: |
0ms |
get settings: |
11ms |
get forum list: |
22ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
191ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 241ms |
| total: | 553ms |

| 0 / 0 |
