Форум: "Базы";
Текущий архив: 2003.05.15;
Скачать: [xml.tar.bz2];
ВнизХранимая процедура.... Найти похожие ветки
← →
_Narayan_ (2003-04-24 17:04) [0]Хранимая процедура возвращает множество значений в один выходной параметр. Как мне каждое значение (по очереди) обработать ?
← →
Соловьев (2003-04-24 17:06) [1]
for
select
...
do
begin
...
suspend;
end
← →
Соловьев (2003-04-24 17:10) [2]
> Как мне каждое значение (по очереди) обработать ?
while not Eof do
begin
...
Next;
end;
← →
_Narayan_ (2003-04-24 17:23) [3]2 Соловьев
Чтобы использовать Eof нужно сначала воспользоваться методом Open (Active:=True), но если применять его, появляется ошибка типа "Open" - для "Query", а для "StoredProc" - "ExeProc".
И ваще, до этого я и сам додумался ;-)
Короче не то
← →
Соловьев (2003-04-24 17:26) [4]
> ошибка типа "Open" - для "Query", а для "StoredProc" - "ExeProc".
ты что-то не то делаешь. SP - Open тоже есть метод, если возвращает НД.
← →
Doomalka (2003-04-24 17:27) [5]2 _Narayan_ (24.04.03 17:23)
если ошибка то может она в ХП?
← →
Zacho (2003-04-24 17:31) [6]А в чем проблемы-то ? В FOR SELECT .. DO .. в ХП или в SELECT .. FROM MY_STORED_PROC на клиенте ?
← →
kravchuk (2003-04-24 17:35) [7]_Narayan_ (24.04.03 17:23)
просто там надо сделать select из процедуры и не будет ошибка типа "Open" - для "Query", а для "StoredProc" - "ExeProc".
← →
_Narayan_ (2003-04-24 17:49) [8]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 !!
← →
Соловьев (2003-04-24 17:50) [9]
> Ну хорошо, в таком случае как должна выглядеть такая процедура
забыл
> Соловьев © (24.04.03 17:06)
← →
Doomalka (2003-04-24 17:52) [10]2 _Narayan_ (24.04.03 17:49)
не вижу ни одного suspend....
← →
Doomalka (2003-04-24 17:56) [11]2 _Narayan_ (24.04.03 17:49)
а вообще ты не заметил, что все у тебя спрашиваю где именно у тебя проблема? в ХП или в обрабоке значений....
судя по твоей процедуре именно в ХП....
если у тебя должно возвразаться несколько значений в одну переменную то смотри >Соловьев © (24.04.03 17:06)
← →
_Narayan_ (2003-04-24 18:03) [12]2 Doomalka
Мне помощь нужна, а не бессвязные реплики
← →
Zacho (2003-04-24 18:18) [13]
> _Narayan_ (24.04.03 17:49)
Ну откуда я знаю как она должна выглядеть ? Что ты хочешь получить ? Конкретно, в чем проблема ? В ХП для выборки одной записи используется SELECT .. INTO ... Для выборки и обработки набора записей - FOR SELECT .. INTO .. DO .. Почитай в документации про FOR SELECT DO и SUSPEND.
← →
_Narayan_ (2003-04-24 19:50) [14]Всё, разобрался.
Всем спасибо, без Вас не справился бы.
← →
Zacho (2003-04-24 20:03) [15]
> _Narayan_ (24.04.03 19:50)
Просто из любопытства, да и чтоб другие на те же грабли не наступали :) задам вопрос:
Все-таки, в чем была проблема ? В выборке набора записей в ХП или в получении их на клиенте ? Или вообще в чем-то другом ? И как решилась ?
← →
_Narayan_ (2003-04-24 20:25) [16]Вобщето и в выборке набора записей, и в получении их на клиенте.
А решилось просто: корректировка процедуры (ниже) плюс замена 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:55) [17]
> _Narayan_ (24.04.03 20:25)
Хочу дать небольшой совет, может пригодится :)
1.Не знаю, какими компонентами доступа ты пользуешся, но возникло подозрение, что BDE. Тогда совет: если возможно, переходи на что-нибудь более нормальное, типа IBX, FIBPlus или IBO - убережешся от многих проблем.
2. Если ты все-таки используешь IBX, то не стоит пользоваться TIBStoredProc и TIBQuery (впрочем, TIBQuery еще можно, если хорошо понимаешь ее возможности и ограничения). Для всего, что может потребоваться, достаточно TIBDataSet и TIBSQL, и возможных проблем будет меньше.
Удачи !
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.05.15;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c