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

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

Хранимая процедура.... [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


Наверх

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