Текущий архив: 2009.06.07;
Скачать: CL | DM;
Вниз
Как подставить переменную в запрос? Найти похожие ветки
← →
Клён новичок (2008-09-22 11:18) [0]Здравствуйте. Есть запрос:<br/><br/><code>SELECT * FROM BazaDannih.DB OR<span style="background-color: yellow">DER</span> BY Pole </code><br/><br/>Как мне вставить вместо Pole переменную?<br/>Чтоб как нибудь так получилось...<br/><code><br/>var<br/>  Perem : string;<br/>begin<br/>  Perem :="Name" ;<br/>  SELECT * FROM BazaDannih.DB OR<span style="background-color: yellow">DER</span> BY Perem<br/> <br/></code>
← →
Поросенок Винни-Пух © (2008-09-22 11:19) [1]"SELECT * FROM BazaDannih.DB OR<span style="background-color: yellow">DER</span> BY " + Perem
← →
Vlad Oshin © (2008-09-22 11:26) [2]в общем случае см. 1<br/>в ADO есть Parameters<br/>в DOA есть Variables<br/>в чем то еще что-то еще
← →
Труп Васи Доброго © (2008-09-22 11:37) [3]В TQuery пишешь свой запрос "SELECT * FROM BazaDannih.DB OR<span style="background-color: yellow">DER</span> BY :Pole"<br/>Потом гоняй как хочешь через присваивание нужного значения параметру :Pole
← →
Sergey13 © (2008-09-22 11:42) [4]> [3] Труп Васи Доброго ©   (22.09.08 11:37)<br/><br/>Сам то пробовал так?
← →
Johnmen © (2008-09-22 11:48) [5]<i><br/>> Труп Васи Доброго © (22.09.08 11:37) [3]<br/></i><br/>Не болтайте ерундой (с)
← →
ANB (2008-09-22 12:37) [6]<i><br/>> в общем случае см. 1<br/>> в ADO есть Parameters<br/>> в DOA есть Variables<br/>> в чем то еще что-то еще<br/></i><br/>параметры и переменные в данном случае никаким боком не прокатывают. Разве что макросы, которые мало кто есть (DOA, ODAC).<br/>Так что выход - только динамически формировать текст запроса. Впрочем, использование макросов фактически дает такой же эффект - изменяется текст запроса.
← →
Виталий Панасенко (2008-09-22 14:51) [7]JEDI/RxLib использует макросы для такой ситуации
← →
Труп Васи Доброго © (2008-09-23 09:43) [8]<i><br/>> Сам то пробовал так?<br/></i><br/>Бейте меня ногами - не врубился в вопрос! (пьяный что-ли был)<br/>А по теме: В RXLib есть компонент запроса, вот там в параметрах можно и таблицу другую подставить и поле любое.
← →
Sergey13 © (2008-09-23 09:54) [9]> [8] Труп Васи Доброго ©   (23.09.08 09:43)<br/>> вот там в параметрах <br/><br/>Там, если мне память не изменяет, это называется макросами. Они существуют паралельно с нормальными параметрами и являются по сути оберткой к переписыванию текста запроса.
← →
Труп Васи Доброго © (2008-09-23 10:13) [10]<i><br/>> Там, если мне память не изменяет, это называется макросами.<br/>>  <br/></i><br/>Ну да, я про них и имел в виду.<br/>Тогда в TRxQuery запрос будет такой: "SELECT * FROM BazaDannih.DB OR<span style="background-color: yellow">DER</span> BY %Pole"
← →
Vlad Oshin © (2008-09-23 10:26) [11]и тем не менее, почему a всегда меньше b<br/><br/>procedure TForm1.Button1Click(Sen<span style="background-color: yellow">der</span>: TObject);<br/>var<br/> i:integer;<br/> a,b:longint;<br/> step:integer;<br/>begin<br/>  step:=30;<br/><br/>  a:=GetTickCount;<br/>  for I := 0 to step do<br/>  begin<br/>    OracleDataSet1.Active:=false;<br/>    OracleDataSet1.SetVariable("OWNER","SYS");<br/>    OracleDataSet1.Active:=true;<br/><br/>    OracleDataSet1.Active:=false;<br/>    OracleDataSet1.SetVariable("OWNER","SYSTEM");<br/>    OracleDataSet1.Active:=true;<br/><br/>    OracleDataSet1.Active:=false;<br/>    OracleDataSet1.SetVariable("OWNER","SDD");<br/>    OracleDataSet1.Active:=true;<br/><br/>    OracleDataSet1.Active:=false;<br/>    OracleDataSet1.SetVariable("OWNER","WH1");<br/>    OracleDataSet1.Active:=true;<br/>  end;<br/>  a:=GetTickCount-a;<br/><br/>  b:=GetTickCount;<br/>  for I := 0 to step do<br/>  begin<br/>    OracleDataSet2.Active:=false;<br/>    OracleDataSet2.SQL.Text:="Select * from all_all_tables where OWNER ="+ quotedstr("SYS");<br/>    OracleDataSet2.Active:=true;<br/><br/>    OracleDataSet2.Active:=false;<br/>    OracleDataSet2.SQL.Text:="Select * from all_all_tables where OWNER = "+ quotedstr("SYSTEM");<br/>    OracleDataSet2.Active:=true;<br/><br/>    OracleDataSet2.Active:=false;<br/>    OracleDataSet2.SQL.Text:="Select * from all_all_tables where OWNER = "+ quotedstr("SDD");<br/>    OracleDataSet2.Active:=true;<br/><br/>    OracleDataSet2.Active:=false;<br/>    OracleDataSet2.SQL.Text:="Select * from all_all_tables where OWNER = "+ quotedstr("WH1");<br/>    OracleDataSet2.Active:=true;<br/>  end;<br/>  b:=GetTickCount-b;<br/><br/>  ShowMessageFmt("%d %d",[a,b]);<br/><br/>end;
← →
ANB (2008-09-23 11:07) [12]<i><br/>> Vlad Oshin ©   (23.09.08 10:26) [11] <br/></i><br/>Хех. Как раз у тебя пример параметризации литералов. Для чего она, собственно и задумана. И ты действительно экономишь (правда, не так уж и много, т.е. заметно если таки запросы выполняются довольно часто) на времени разбора запроса.<br/><br/>Ты имя таблицы попробуй подставить.<br/><br/>Ну и плюс - учти, что оракл - штука хитрая и любит все кэшировать. Так что произвести сравнительный тест на скорость в равных условиях не так уж и просто.
← →
ANB (2008-09-23 11:09) [13]<i><br/>> и тем не менее, почему a всегда меньше b<br/></i><br/>Да, кстати, а тут будет не всегда меньше б. Запусти еще раз - и они будут одинаковые, т.к. непараметризованные запросы тоже легли в процедурный кэш.
← →
kaif © (2008-09-24 01:33) [14]Кстати, в тексте SQLзапроса SELECT можно не только имя поля указывать в OR<span style="background-color: yellow">DER</span> BY, но и номер вместо этого (OR<span style="background-color: yellow">DER</span> BY 3 - упорядочить по третьей колонке возвращаемого набора).<br/> <br/>Иногда это удобно.<br/><br/>А в качестве параметра в общем случае в OR<span style="background-color: yellow">DER</span> BY нельзя ничего пихать, так как запрос <i>подготавливается</i> (сервер выбирает план, какие индексы юзать) <i>в зависимости </i>от того, что в OR<span style="background-color: yellow">DER</span> BY указано. <br/><br/>То есть параметризованный запрос сначала 1 раз подготавливается на сервере методом PREPARE, а уже <b>затем</b> может много раз вызваться метод EXECUTE с теми или иными параметрами. <br/><br/>А так как подготовка (оптимизация) очень сильно зависит от OR<span style="background-color: yellow">DER</span> BY, поэтому параметры в этом месте передать нельзя. Разве что какой-нибудь навороченный компонент xxQuery как-нибудь сэмулирует якобы "параметр", реально просто заменив текст запроса. На сервер это в качестве законного <i>параметра</i> попасть не может в принципе.  Если такой сервер и существует, то я о нем не знаю.
← →
Поросенок Винни-Пух © (2008-09-24 09:25) [15]ему как раз для препара нужен валидный текст запроса.<br/>а "...ордер бай ?" для него непонятно.
← →
Anatoly Podgoretsky © (2008-09-24 09:53) [16]<i>> Поросенок Винни-Пух  (24.09.2008 9:25:15)  [15]</i><br/><br/>Проще - метаданные с параметрами не живут.
← →
ANB (2008-09-24 19:28) [17]<i><br/>> kaif ©   (24.09.08 01:33) [14]<br/></i><br/>Абсолютно прав с выводами и совершенно не прав в рассуждении о причинах :)
Страницы: 1 вся ветка
Текущий архив: 2009.06.07;
Скачать: CL | DM;
Память: 1.14 MB
Время: 0.021 c