Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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/> &#xA0;Perem : string;<br/>begin<br/> &#xA0;Perem :=&quot;Name&quot; ;<br/> &#xA0;SELECT * FROM BazaDannih.DB OR<span style="background-color: yellow">DER</span> BY Perem<br/> <br/></code>


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

&quot;SELECT * FROM BazaDannih.DB OR<span style="background-color: yellow">DER</span> BY &quot; + Perem


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

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


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

В TQuery пишешь свой запрос &quot;SELECT * FROM BazaDannih.DB OR<span style="background-color: yellow">DER</span> BY :Pole&quot;<br/>Потом гоняй как хочешь через присваивание нужного значения параметру :Pole


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

&gt; [3] Труп Васи Доброго © &#xA0; (22.09.08 11:37)<br/><br/>Сам то пробовал так?


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

<i><br/>&gt; Труп Васи Доброго ©   (22.09.08 11:37) [3]<br/></i><br/>Не болтайте ерундой (с)


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

<i><br/>&gt; в общем случае см. 1<br/>&gt; в ADO есть Parameters<br/>&gt; в DOA есть Variables<br/>&gt; в чем то еще что-то еще<br/></i><br/>параметры и переменные в данном случае никаким боком не прокатывают. Разве что макросы, которые мало кто есть (DOA, ODAC).<br/>Так что выход - только динамически формировать текст запроса. Впрочем, использование макросов фактически дает такой же эффект - изменяется текст запроса.


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

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


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

<i><br/>&gt; Сам то пробовал так?<br/></i><br/>Бейте меня ногами - не врубился в вопрос! (пьяный что-ли был)<br/>А по теме: В RXLib есть компонент запроса, вот там в параметрах можно и таблицу другую подставить и поле любое.


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

&gt; [8] Труп Васи Доброго © &#xA0; (23.09.08 09:43)<br/>&gt; вот там в параметрах <br/><br/>Там, если мне память не изменяет, это называется макросами. Они существуют паралельно с нормальными параметрами и являются по сути оберткой к переписыванию текста запроса.


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

<i><br/>&gt; Там, если мне память не изменяет, это называется макросами.<br/>&gt; &#xA0;<br/></i><br/>Ну да, я про них и имел в виду.<br/>Тогда в TRxQuery запрос будет такой: &quot;SELECT * FROM BazaDannih.DB OR<span style="background-color: yellow">DER</span> BY %Pole&quot;


 
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/> &#xA0;step:=30;<br/><br/> &#xA0;a:=GetTickCount;<br/> &#xA0;for I := 0 to step do<br/> &#xA0;begin<br/> &#xA0; &#xA0;OracleDataSet1.Active:=false;<br/> &#xA0; &#xA0;OracleDataSet1.SetVariable(&quot;OWNER&quot;,&quot;SYS&quot;);<br/> &#xA0; &#xA0;OracleDataSet1.Active:=true;<br/><br/> &#xA0; &#xA0;OracleDataSet1.Active:=false;<br/> &#xA0; &#xA0;OracleDataSet1.SetVariable(&quot;OWNER&quot;,&quot;SYSTEM&quot;);<br/> &#xA0; &#xA0;OracleDataSet1.Active:=true;<br/><br/> &#xA0; &#xA0;OracleDataSet1.Active:=false;<br/> &#xA0; &#xA0;OracleDataSet1.SetVariable(&quot;OWNER&quot;,&quot;SDD&quot;);<br/> &#xA0; &#xA0;OracleDataSet1.Active:=true;<br/><br/> &#xA0; &#xA0;OracleDataSet1.Active:=false;<br/> &#xA0; &#xA0;OracleDataSet1.SetVariable(&quot;OWNER&quot;,&quot;WH1&quot;);<br/> &#xA0; &#xA0;OracleDataSet1.Active:=true;<br/> &#xA0;end;<br/> &#xA0;a:=GetTickCount-a;<br/><br/> &#xA0;b:=GetTickCount;<br/> &#xA0;for I := 0 to step do<br/> &#xA0;begin<br/> &#xA0; &#xA0;OracleDataSet2.Active:=false;<br/> &#xA0; &#xA0;OracleDataSet2.SQL.Text:=&quot;Select * from all_all_tables where OWNER =&quot;+ quotedstr(&quot;SYS&quot;);<br/> &#xA0; &#xA0;OracleDataSet2.Active:=true;<br/><br/> &#xA0; &#xA0;OracleDataSet2.Active:=false;<br/> &#xA0; &#xA0;OracleDataSet2.SQL.Text:=&quot;Select * from all_all_tables where OWNER = &quot;+ quotedstr(&quot;SYSTEM&quot;);<br/> &#xA0; &#xA0;OracleDataSet2.Active:=true;<br/><br/> &#xA0; &#xA0;OracleDataSet2.Active:=false;<br/> &#xA0; &#xA0;OracleDataSet2.SQL.Text:=&quot;Select * from all_all_tables where OWNER = &quot;+ quotedstr(&quot;SDD&quot;);<br/> &#xA0; &#xA0;OracleDataSet2.Active:=true;<br/><br/> &#xA0; &#xA0;OracleDataSet2.Active:=false;<br/> &#xA0; &#xA0;OracleDataSet2.SQL.Text:=&quot;Select * from all_all_tables where OWNER = &quot;+ quotedstr(&quot;WH1&quot;);<br/> &#xA0; &#xA0;OracleDataSet2.Active:=true;<br/> &#xA0;end;<br/> &#xA0;b:=GetTickCount-b;<br/><br/> &#xA0;ShowMessageFmt(&quot;%d %d&quot;,[a,b]);<br/><br/>end;


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

<i><br/>&gt; Vlad Oshin © &#xA0; (23.09.08 10:26) [11] <br/></i><br/>Хех. Как раз у тебя пример параметризации литералов. Для чего она, собственно и задумана. И ты действительно экономишь (правда, не так уж и много, т.е. заметно если таки запросы выполняются довольно часто) на времени разбора запроса.<br/><br/>Ты имя таблицы попробуй подставить.<br/><br/>Ну и плюс - учти, что оракл - штука хитрая и любит все кэшировать. Так что произвести сравнительный тест на скорость в равных условиях не так уж и просто.


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

<i><br/>&gt; и тем не менее, почему 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 как-нибудь сэмулирует якобы &quot;параметр&quot;, реально просто заменив текст запроса. На сервер это в качестве законного <i>параметра</i> попасть не может в принципе. &#xA0;Если такой сервер и существует, то я о нем не знаю.


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

ему как раз для препара нужен валидный текст запроса.<br/>а &quot;...ордер бай ?&quot; для него непонятно.


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

<i>&gt; Поросенок Винни-Пух &#xA0;(24.09.2008 9:25:15) &#xA0;[15]</i><br/><br/>Проще - метаданные с параметрами не живут.


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

<i><br/>&gt; kaif © &#xA0; (24.09.08 01:33) [14]<br/></i><br/>Абсолютно прав с выводами и совершенно не прав в рассуждении о причинах :)



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

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

Наверх




Память: 1.14 MB
Время: 0.021 c
15-1238617804
Юрий
2009-04-02 00:30
2009.06.07
С днем рождения ! 2 апреля 2009 четверг


15-1238603200
Городской Шаман
2009-04-01 20:26
2009.06.07
Microsoft уроды со своей VS.


2-1240231874
night_light
2009-04-20 16:51
2009.06.07
сжатие и отправкакартинки по сети


10-1158422614
aglar
2006-09-16 20:03
2009.06.07
Вставить слово в ворд.. не знаю даже, с чего начать...


2-1240403175
devidart
2009-04-22 16:26
2009.06.07
Сортировка таблици