C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Работа с TADOStoredProc, Задача для мастеров
СЕРЖ
Отправлено: 25.07.2003, 19:08


Не зарегистрирован







Здравствуйте, кульные программеры!

У меня возникла проблема. Кто знает как ее решить напишите, пожалуйста.

Проблема:
Хранимая процедура на сервере выполняет несколько раз оператор SELECT (т.е. в ее коде несколько раз встречается этот оператор).
Когда я пытаюсь выполнить ее в Builder с помощью компонента TADOStoredProc->Open(), то выполняется только первый SELECT, а второй уже никак не может выполниться!
Скажите, пожалуйста, как сделать так, чтобы выполнялись все операторы SELECT хранимой процедуры, используя для этого компонент TADOStoredProc, если, конечно, это вообще возможно?
Young Coder
Отправлено: 25.07.2003, 22:46


Дежурный стрелочник

Группа: Участник
Сообщений: 34



Попробуй вместо ->Open(); ->ExecProc();
Admin
Отправлено: 26.07.2003, 22:18


Владимир

Группа: Администратор
Сообщений: 1190



Ну почему-же Вы никто код не приводите ??? wink.gif

QUOTE

Когда я пытаюсь выполнить ее в Builder с помощью компонента TADOStoredProc->Open(), то выполняется только первый SELECT, а второй уже никак не может выполниться!


Я так понимаю нужно четко по шагам понять что мы хотим и
что для этого делаем.

Итак, для того чтобы понять как работает хранимая процедура и
что она возвращает проведем ее разбор, что происходит внутри
хранимой процедуры и что она нам возвращает.

Существует два типа хранимых процедур: исполняемые хранимые
процедуры (Insert,Update,Delete) и процедуры выбирающие данные
(Select)
Исполняемые процедуры запускают на выполнение
с помощью компонента StoredProc, а на выборку данных -
с помощью компонента Query.

В нашем случае нас интересует процедура на выборку (Select)

CODE

create procedure sss
returns(mid integer, mname varchar(30))
as
  begin
      for
         select id, name from myTable into :mid, :mname
      do suspend;
end


---------
Что здесь происходит — мы объявляем хранимую процедуру с именем
sss которая возвращает набор данных.
Данные считываются в цикле
for select ... do по одной записи и помещаются в переменные
mid и mname
далее по команде suspend эти переменные посылаются клиенту,
и так в цикле, пока не выберет все запрошенные записи из
таблицы myTable и не передаст их через переменные mid и mname
клиенту.

Что делать если нужно вернуть клиенту данные из несколькмх
запросов Select из одной хранимой процедуры ?
Вывод следующий — попробуем возвращать эти данные вот так:

CODE

create procedure sss
returns(mid integer, mname varchar(30))
as
begin
    for
         select id, name from myTable1 into :mid, :mname
      do suspend;
    for
         select id, name from myTable2 into :mid, :mname
      do suspend;
    for
         select id, name from myTable3 into :mid, :mname
      do suspend;
end



Далее, для того чтобы не исполнить хранимую процедуру, а получить
из нее набор данных, вызвыть ее лучше не с помощью компонента
ADOStoredProc, а с помощью компонента ADOQuery,
записав в ее свойтсво SQL вызов хранимой процедуры:

ADOQuery1->SQL->Add("Select * from sss");
ADOQuery1->Open();

в результате будет выполнена хранимая процедура sss,
которая и вернет все запрошенные данные, получить которые
мы можем как обычно:

CODE

while(!ADOQuery1->Eof){
   ...
   ADOQuery1->Next();
   }


В результате будут возвращены запрошенные данные
из 3 таблиц — myTable1, myTable2, myTable3.

Вернуться в Работа с базами данных в C++Builder