СЕРЖ |
Отправлено: 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
|
Ну почему-же Вы никто код не приводите ???
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.
|
|
|