Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.06.07;
Скачать: CL | DM;

Вниз

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

 
Клён новичок   (2008-09-22 11:18) [0]

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

SELECT * FROM BazaDannih.DB ORDER BY Pole

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

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



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

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


 
Vlad Oshin ©   (2008-09-22 11:26) [2]

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


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

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


 
Sergey13 ©   (2008-09-22 11:42) [4]

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

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


 
Johnmen ©   (2008-09-22 11:48) [5]


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

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


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


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

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


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

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


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


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

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


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

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

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


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


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

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


 
Vlad Oshin ©   (2008-09-23 10:26) [11]

и тем не менее, почему 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;


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


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

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

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

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


 
ANB   (2008-09-23 11:09) [13]


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

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


 
kaif ©   (2008-09-24 01:33) [14]

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

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

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

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

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


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

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


 
Anatoly Podgoretsky ©   (2008-09-24 09:53) [16]

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

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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2009.06.07;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.008 c
3-1221992597
DAdd
2008-09-21 14:23
2009.06.07
Ограничение длины строки


15-1238708491
Kerk
2009-04-03 01:41
2009.06.07
Lazarus


15-1238827193
dreamse
2009-04-04 10:39
2009.06.07
Плагины для IE


15-1238663375
Галинка
2009-04-02 13:09
2009.06.07
Приложение автоматизации Ворда: вопрос...


11-1201435065
Blackman
2008-01-27 14:57
2009.06.07
ограничения на размер PStrList