Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как подставить переменную в запрос?


Клён новичок ©   (2008-09-22 11:18:00) 

Здравствуйте. Есть запрос:

SELECT * FROM BazaDannih.DB ORDER BY Pole

Как мне вставить вместо Pole переменную?
Чтоб как нибудь так получилось...

var
 Perem : string;
begin
 Perem :='Name' ;
 SELECT * FROM BazaDannih.DB ORDER BY Perem


ANB   (2008-09-24 19:28:00) [1]


> kaif ©   (24.09.08 01:33) [14]

Абсолютно прав с выводами и совершенно не прав в рассуждении о причинах :)


Anatoly Podgoretsky   (2008-09-24 09:53:00) [2]

> Поросенок Винни-Пух  (24.09.2008 9:25:15)  [15]

Проще - метаданные с параметрами не живут.


Поросенок Винни-Пух   (2008-09-24 09:25:00) [3]

ему как раз для препара нужен валидный текст запроса.
а '...ордер бай ?' для него непонятно.


kaif   (2008-09-24 01:33:00) [4]

Кстати, в тексте SQLзапроса SELECT можно не только имя поля указывать в ORDER BY, но и номер вместо этого (ORDER BY 3 - упорядочить по третьей колонке возвращаемого набора).

Иногда это удобно.

А в качестве параметра в общем случае в ORDER BY нельзя ничего пихать, так как запрос подготавливается(сервер выбирает план, какие индексы юзать) в зависимостиот того, что в ORDER BY указано.

То есть параметризованный запрос сначала 1 раз подготавливается на сервере методом PREPARE, а уже затемможет много раз вызваться метод EXECUTE с теми или иными параметрами.

А так как подготовка (оптимизация) очень сильно зависит от ORDER BY, поэтому параметры в этом месте передать нельзя. Разве что какой-нибудь навороченный компонент xxQuery как-нибудь сэмулирует якобы "параметр", реально просто заменив текст запроса. На сервер это в качестве законного параметрапопасть не может в принципе.  Если такой сервер и существует, то я о нем не знаю.


ANB   (2008-09-23 11:09:00) [5]


> и тем не менее, почему a всегда меньше b

Да, кстати, а тут будет не всегда меньше б. Запусти еще раз - и они будут одинаковые, т.к. непараметризованные запросы тоже легли в процедурный кэш.


ANB   (2008-09-23 11:07:00) [6]


> Vlad Oshin ©   (23.09.08 10:26) [11]

Хех. Как раз у тебя пример параметризации литералов. Для чего она, собственно и задумана. И ты действительно экономишь (правда, не так уж и много, т.е. заметно если таки запросы выполняются довольно часто) на времени разбора запроса.

Ты имя таблицы попробуй подставить.

Ну и плюс - учти, что оракл - штука хитрая и любит все кэшировать. Так что произвести сравнительный тест на скорость в равных условиях не так уж и просто.


Vlad Oshin   (2008-09-23 10:26:00) [7]

и тем не менее, почему a всегда меньше b

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
a,b:longint;
step:integer;
begin
 step:=30;

 a:=GetTickCount;
 for I := 0 to step do
 begin
   OracleDataSet1.Active:=false;
   OracleDataSet1.SetVariable('OWNER','SYS');
   OracleDataSet1.Active:=true;

   OracleDataSet1.Active:=false;
   OracleDataSet1.SetVariable('OWNER','SYSTEM');
   OracleDataSet1.Active:=true;

   OracleDataSet1.Active:=false;
   OracleDataSet1.SetVariable('OWNER','SDD');
   OracleDataSet1.Active:=true;

   OracleDataSet1.Active:=false;
   OracleDataSet1.SetVariable('OWNER','WH1');
   OracleDataSet1.Active:=true;
 end;
 a:=GetTickCount-a;

 b:=GetTickCount;
 for I := 0 to step do
 begin
   OracleDataSet2.Active:=false;
   OracleDataSet2.SQL.Text:='Select * from all_all_tables where OWNER ='+ quotedstr('SYS');
   OracleDataSet2.Active:=true;

   OracleDataSet2.Active:=false;
   OracleDataSet2.SQL.Text:='Select * from all_all_tables where OWNER = '+ quotedstr('SYSTEM');
   OracleDataSet2.Active:=true;

   OracleDataSet2.Active:=false;
   OracleDataSet2.SQL.Text:='Select * from all_all_tables where OWNER = '+ quotedstr('SDD');
   OracleDataSet2.Active:=true;

   OracleDataSet2.Active:=false;
   OracleDataSet2.SQL.Text:='Select * from all_all_tables where OWNER = '+ quotedstr('WH1');
   OracleDataSet2.Active:=true;
 end;
 b:=GetTickCount-b;

 ShowMessageFmt('%d %d',[a,b]);

end;


Труп Васи Доброго   (2008-09-23 10:13:00) [8]


> Там, если мне память не изменяет, это называется макросами.
>  

Ну да, я про них и имел в виду.
Тогда в TRxQuery запрос будет такой: 'SELECT * FROM BazaDannih.DB ORDER BY %Pole'


Sergey13   (2008-09-23 09:54:00) [9]

> [8] Труп Васи Доброго ©   (23.09.08 09:43)
> вот там в параметрах

Там, если мне память не изменяет, это называется макросами. Они существуют паралельно с нормальными параметрами и являются по сути оберткой к переписыванию текста запроса.


Труп Васи Доброго   (2008-09-23 09:43:00) [10]


> Сам то пробовал так?

Бейте меня ногами - не врубился в вопрос! (пьяный что-ли был)
А по теме: В RXLib есть компонент запроса, вот там в параметрах можно и таблицу другую подставить и поле любое.


Виталий Панасенко   (2008-09-22 14:51:00) [11]

JEDI/RxLib использует макросы для такой ситуации


ANB   (2008-09-22 12:37:00) [12]


> в общем случае см. 1
> в ADO есть Parameters
> в DOA есть Variables
> в чем то еще что-то еще

параметры и переменные в данном случае никаким боком не прокатывают. Разве что макросы, которые мало кто есть (DOA, ODAC).
Так что выход - только динамически формировать текст запроса. Впрочем, использование макросов фактически дает такой же эффект - изменяется текст запроса.


Johnmen   (2008-09-22 11:48:00) [13]


> Труп Васи Доброго ©   (22.09.08 11:37) [3]

Не болтайте ерундой (с)


Sergey13   (2008-09-22 11:42:00) [14]

> [3] Труп Васи Доброго ©   (22.09.08 11:37)

Сам то пробовал так?


Труп Васи Доброго   (2008-09-22 11:37:00) [15]

В TQuery пишешь свой запрос 'SELECT * FROM BazaDannih.DB ORDER BY :Pole'
Потом гоняй как хочешь через присваивание нужного значения параметру :Pole


Vlad Oshin   (2008-09-22 11:26:00) [16]

в общем случае см. 1
в ADO есть Parameters
в DOA есть Variables
в чем то еще что-то еще


Поросенок Винни-Пух   (2008-09-22 11:19:00) [17]

'SELECT * FROM BazaDannih.DB ORDER BY ' + Perem


Наверх

Титульная страница Поиск, карта сайта Написать письмо