Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Синтаксис Query [D7, IB6.x, Cache]


Skulll ©   (2004-05-07 17:01:00) 


 SELECT n.id_price, n.id_sklad
   FROM nakl_in n
   WHERE n.id_nakl_in=:id_nakl_in
   INTO :ID_PRICE1, :ID_SKLAD
;
 SELECT s.id_price
   FROM sklad s
   WHERE s.id_sklad=:ID_SKLAD
   INTO :ID_PRICE2
 ;
 EXECUTE PROCEDURE price_copy (:ID_PRICE1, :ID_PRICE2);

Делфа не понимает INTO в Select в Query.
Модно ли в Query использовать локальные переменные?
Хранимую процедуру сделять не представляется возможным.


Desdechado   (2004-05-08 15:09:00) [1]

а что, вызвать квери 3 раза с разным текстом запроса нельзя?
имхе, самый простой выход


Skulll   (2004-05-08 10:32:00) [2]

>Nikolay M.
>Почему пример из сабжа просто не сделать одним запросом? Не >нужны будут никакие переменные.
Это и есть один запрос. Правдо я про ";" забыл, надо наверное SET TERM.

>Мунька ©
у меня задача немного другая.
:id_nakl_in - входной параметр
ID_PRICE1, :ID_PRICE2, :ID_SKLAD - локальные переменные определяемые через :id_nakl_in
Выходных параметров нет.

Вообще я нашен немного геморойный, но выход. Надо на каждый блок создовани свой запрос.
Блок 1

SELECT n.id_price, n.id_sklad
  FROM nakl_in n
  WHERE n.id_nakl_in=:id_nakl_in
  INTO :ID_PRICE1, :ID_SKLAD

Блок 2

SELECT s.id_price
  FROM sklad s
  WHERE s.id_sklad=:ID_SKLAD
  INTO :ID_PRICE2

Блок 3

EXECUTE PROCEDURE price_copy (:ID_PRICE1, :ID_PRICE2)

Но у меня price_copy состоит из четырех блоков с циклом.
Как я понял SQL Query нельзя такое проделять


HSolo   (2004-05-07 17:51:00) [3]

Про Cache я не знаю ничего, кроме факта его существования :( Но, может, Вам достаточно выполнить с клиента примерно такой запрос:

SELECT n.id_price id_price1, n.id_sklad, s.id_price id_price2
  FROM nakl_in n
  JOIN sklad s on s.id_sklad = n.id_sklad
  WHERE n.id_nakl_in = :id_nakl_in

(с точностью до синтаксиса - не знаю, как выглядит join в cache)


Мунька   (2004-05-07 17:44:00) [4]

Параметризованный запрос
sqltxt = "DELETE FROM TableHistory " + AnsiString("\n");
sqltxt =  sqltxt  + "WHERE UserId =" + IntToStr(UserId);
sqltxt += " AND (DateTimeEvent BETWEEN :DTEB AND :DTEE) ";
//:DTEB, :DTEE - параметры, их отличительная особенность :

ADODelHist->SQL->Clear();
  ADODelHist->SQL->Add(sqltxt);
  try
  {

    //Здесь в параметры передаются значения
      ADODelHist->Parameters->ParamByName(WideString("DTEB"))->Value = BDT;
      ADODelHist->Parameters->ParamByName(WideString("DTEE"))->Value = EDT;
   
   if (!ADODelHist->Prepared)
       ADODelHist->Prepared = true;
  ADODelHist->ExecSQL() ;
  }
  catch(...)
  {
   ModalResult = mrCancel;
   return;
  }


Nikolay M.   (2004-05-07 17:41:00) [5]

Какие-то почесывание левой ногой, имхо.
Почему пример из сабжа просто не сделать одним запросом? Не нужны будут никакие переменные.


Skulll   (2004-05-07 17:24:00) [6]

>Мунька
>INTO - особенность Интербэйса?
Это я догодывался, я так для примера привел

>HSolo
У меня сервер Cache. Он тоже INTO в SELECT не понимает.

Вот можно ли какнибудь в стандартном SQL(QUERY) не зависящем от Interbase'а использовать локальные переменные, т.е обьявить та их можно но как в них из select'а передать значения


HSolo   (2004-05-07 17:16:00) [7]

>Хранимую процедуру сделять не представляется возможным
Так - да :) А зачем ее с клиента создавать?

На сервере:
create procedure New_Procedure (входные_параметры)
returns (выходные_параметры)
as
begin
 /* Procedure Text */
 suspend;
end

На клиенте:
select ... from New_Procedure (входные_параметры)


Мунька   (2004-05-07 17:06:00) [8]

Чего то я не понимаю, а причем здесь INTO к SELECT? Вы хотите как-то по-особому назвать извлеченные данные? Или что?
Или INTO - особенность Интербэйса?


Наверх

Титульная страница Поиск, карта сайта Написать письмо