Форум: "Базы";
Текущий архив: 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