Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2009.06.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
Клён новичок   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.004 c
15-1238836531
rnts
2009-04-04 13:15
2009.06.07
С днём web-программиста!


2-1240234324
NGPOL
2009-04-20 17:32
2009.06.07
Клиент-сервер на DCOM. AppendRecord не работает


6-1203515166
MonsterHell
2008-02-20 16:46
2009.06.07
Переопределение днс2


2-1238778258
Kos
2009-04-03 21:04
2009.06.07
отрисовка в image


2-1240379974
Лёша
2009-04-22 09:59
2009.06.07
Как вывести негруппируемое поле?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский