![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хранимая процедура.... [D7, IB6.x]
_Narayan_ © (2003-04-24 17:04:00)Хранимая процедура возвращает множество значений в один выходной параметр. Как мне каждое значение (по очереди) обработать ?
Zacho (2003-04-24 20:55:00) [1]
> _Narayan_ (24.04.03 20:25)
Хочу дать небольшой совет, может пригодится :)
1.Не знаю, какими компонентами доступа ты пользуешся, но возникло подозрение, что BDE. Тогда совет: если возможно, переходи на что-нибудь более нормальное, типа IBX, FIBPlus или IBO - убережешся от многих проблем.
2. Если ты все-таки используешь IBX, то не стоит пользоваться TIBStoredProc и TIBQuery (впрочем, TIBQuery еще можно, если хорошо понимаешь ее возможности и ограничения). Для всего, что может потребоваться, достаточно TIBDataSet и TIBSQL, и возможных проблем будет меньше.
Удачи !
_Narayan_ (2003-04-24 20:25:00) [2]Вобщето и в выборке набора записей, и в получении их на клиенте.
А решилось просто: корректировка процедуры (ниже) плюс замена StoredProc на Query (что позволило без проблем использовать Eof)
CREATE PROCEDURE To_GroupLUID (sSp Char(128), sFo char(32), sYear Integer, sNum Integer, sParamCount Integer)
RETURNS (GroupLUID Integer)
AS
DECLARE VARIABLE P0 Integer;
DECLARE VARIABLE P1 Integer;
BEGIN
select LUID from SPECIALNOSTI where NAME=:sSp
INTO :P0;
select LUID from FORMS where NAME=:sFo
INTO :P1;
If (sParamCount=4) Then For select LUID from Groups where Num=:sNum and InComeYear=:sYear and Specialnost=:P0 and Forma=:P1 INTO :GroupLUID DO SUSPEND;
If (sParamCount=3) Then For select LUID from Groups where InComeYear=:sYear and Specialnost=:P0 and Forma=:P1 INTO :GroupLUID DO SUSPEND;
If (sParamCount=2) Then For select LUID from Groups where Specialnost=:P0 and Forma=:P1 INTO :GroupLUID DO SUSPEND;
If (sParamCount=1) Then For select LUID from Groups where Specialnost=:P0 INTO :GroupLUID DO SUSPEND;
If (sParamCount=0) Then For select LUID from Groups INTO :GroupLUID DO SUSPEND;
END !!
Zacho (2003-04-24 20:03:00) [3]
> _Narayan_ (24.04.03 19:50)
Просто из любопытства, да и чтоб другие на те же грабли не наступали :) задам вопрос:
Все-таки, в чем была проблема ? В выборке набора записей в ХП или в получении их на клиенте ? Или вообще в чем-то другом ? И как решилась ?
_Narayan_ (2003-04-24 19:50:00) [4]Всё, разобрался.
Всем спасибо, без Вас не справился бы.
Zacho (2003-04-24 18:18:00) [5]
> _Narayan_ (24.04.03 17:49)
Ну откуда я знаю как она должна выглядеть ? Что ты хочешь получить ? Конкретно, в чем проблема ? В ХП для выборки одной записи используется SELECT .. INTO ... Для выборки и обработки набора записей - FOR SELECT .. INTO .. DO .. Почитай в документации про FOR SELECT DO и SUSPEND.
_Narayan_ (2003-04-24 18:03:00) [6]2 Doomalka
Мне помощь нужна, а не бессвязные реплики
Doomalka (2003-04-24 17:56:00) [7]2 _Narayan_ (24.04.03 17:49)
а вообще ты не заметил, что все у тебя спрашиваю где именно у тебя проблема? в ХП или в обрабоке значений....
судя по твоей процедуре именно в ХП....
если у тебя должно возвразаться несколько значений в одну переменную то смотри >Соловьев © (24.04.03 17:06)
Doomalka (2003-04-24 17:52:00) [8]2 _Narayan_ (24.04.03 17:49)
не вижу ни одного suspend....
Соловьев (2003-04-24 17:50:00) [9]
> Ну хорошо, в таком случае как должна выглядеть такая процедура
забыл
> Соловьев © (24.04.03 17:06)
_Narayan_ (2003-04-24 17:49:00) [10]2 Doomalka
Молодец, блеснула интеллектом
2 Zacho
Ну хорошо, в таком случае как должна выглядеть такая процедура
CREATE PROCEDURE To_GroupLUID (sSp Char(128), sFo char(32), sYear Integer, sNum Integer, sParamCount Integer)
RETURNS (GroupLUID Integer)
AS
DECLARE VARIABLE P0 Integer;
DECLARE VARIABLE P1 Integer;
BEGIN
select LUID from SPECIALNOSTI where NAME=:sSp
INTO :P0;
select LUID from FORMS where NAME=:sFo
INTO :P1;
If (sParamCount=4) Then select LUID from Groups where Num=:sNum and InComeYear=:sYear and Specialnost=:P0 and Forma=:P1 INTO :GroupLUID;
If (sParamCount=3) Then select LUID from Groups where InComeYear=:sYear and Specialnost=:P0 and Forma=:P1 INTO :GroupLUID;
If (sParamCount=2) Then select LUID from Groups where Specialnost=:P0 and Forma=:P1 INTO :GroupLUID;
If (sParamCount=1) Then select LUID from Groups where Specialnost=:P0 INTO :GroupLUID;
If (sParamCount=0) Then select LUID from Groups INTO :GroupLUID;
EXIT;
END !!
kravchuk (2003-04-24 17:35:00) [11]_Narayan_ (24.04.03 17:23)
просто там надо сделать select из процедуры и не будет ошибка типа "Open" - для "Query", а для "StoredProc" - "ExeProc".
Zacho (2003-04-24 17:31:00) [12]А в чем проблемы-то ? В FOR SELECT .. DO .. в ХП или в SELECT .. FROM MY_STORED_PROC на клиенте ?
Doomalka (2003-04-24 17:27:00) [13]2 _Narayan_ (24.04.03 17:23)
если ошибка то может она в ХП?
Соловьев (2003-04-24 17:26:00) [14]
> ошибка типа "Open" - для "Query", а для "StoredProc" - "ExeProc".
ты что-то не то делаешь. SP - Open тоже есть метод, если возвращает НД.
_Narayan_ (2003-04-24 17:23:00) [15]2 Соловьев
Чтобы использовать Eof нужно сначала воспользоваться методом Open (Active:=True), но если применять его, появляется ошибка типа "Open" - для "Query", а для "StoredProc" - "ExeProc".
И ваще, до этого я и сам додумался ;-)
Короче не то
Соловьев (2003-04-24 17:10:00) [16]
> Как мне каждое значение (по очереди) обработать ?
while not Eof do
begin
...
Next;
end;
Соловьев (2003-04-24 17:06:00) [17]
for
select
...
do
begin
...
suspend;
end